From cca6984443a3c348763186eaf8f5c7ea1d16a190 Mon Sep 17 00:00:00 2001 From: Joel Mut Date: Thu, 24 Sep 2020 10:51:13 -0300 Subject: [PATCH 1/3] Add TestBot.Shared project --- Microsoft.Bot.Builder.sln | 1897 +++++++++-------- .../BookingDetails.cs | 14 + .../Bots/DialogAndWelcomeBot.cs | 67 + .../Bots/DialogBot.cs | 53 + .../Bots/MyBot.cs | 17 + .../Cards/welcomeCard.json | 46 + .../CognitiveModels/FlightBooking.cs | 100 + .../CognitiveModels/FlightBooking.json | 334 +++ .../Controllers/BotController.cs | 40 + .../Debugging/DebugAdapter.cs | 8 + .../Debugging/DebugBot.cs | 24 + .../Debugging/DebugController.cs | 25 + .../DialogExtensions.cs | 25 + .../Dialogs/BookingDialog.cs | 87 + .../Dialogs/CancelAndHelpDialog.cs | 63 + .../Dialogs/DateResolverDialog.cs | 89 + .../Dialogs/GetBookingDetailsDialog.cs | 86 + .../Dialogs/MainDialog.cs | 129 ++ .../Dialogs/UserProfileDialog.cs | 144 ++ .../HttpHelper.cs | 72 + ...icrosoft.Bot.Builder.TestBot.Shared.csproj | 25 + .../Services/FlightBookingService.cs | 13 + .../Services/IFlightBookingService.cs | 13 + .../UserProfile.cs | 17 + 24 files changed, 2445 insertions(+), 943 deletions(-) create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/BookingDetails.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/DialogAndWelcomeBot.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/DialogBot.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/MyBot.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Cards/welcomeCard.json create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/CognitiveModels/FlightBooking.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/CognitiveModels/FlightBooking.json create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Controllers/BotController.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugAdapter.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugBot.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugController.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/DialogExtensions.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/BookingDialog.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/CancelAndHelpDialog.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/DateResolverDialog.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/GetBookingDetailsDialog.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/MainDialog.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/UserProfileDialog.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/HttpHelper.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Microsoft.Bot.Builder.TestBot.Shared.csproj create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Services/FlightBookingService.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/Services/IFlightBookingService.cs create mode 100644 tests/Microsoft.Bot.Builder.TestBot.Shared/UserProfile.cs diff --git a/Microsoft.Bot.Builder.sln b/Microsoft.Bot.Builder.sln index eb9bf00c44..0afe4480d5 100644 --- a/Microsoft.Bot.Builder.sln +++ b/Microsoft.Bot.Builder.sln @@ -1,943 +1,954 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29123.88 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{4269F3C3-6B42-419B-B64A-3E6DC0F1574A}" - ProjectSection(SolutionItems) = preProject - libraries\Directory.Build.props = libraries\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{AD743B78-D61F-4FBF-B620-FA83CE599A50}" - ProjectSection(SolutionItems) = preProject - tests\Directory.Build.props = tests\Directory.Build.props - tests\tests.schema = tests\tests.schema - tests\update = tests\update - tests\update.cmd = tests\update.cmd - tests\updateTranscripts.cmd = tests\updateTranscripts.cmd - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive", "libraries\Microsoft.Bot.Builder.Dialogs.Adaptive\Microsoft.Bot.Builder.Dialogs.Adaptive.csproj", "{3CF175CF-1AF4-4109-96CB-221684DCED7D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Tests.csproj", "{CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Azure.Tests", "tests\Microsoft.Bot.Builder.Azure.Tests\Microsoft.Bot.Builder.Azure.Tests.csproj", "{E325A0E2-716A-49E0-9767-5087CF05727C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Azure", "libraries\Microsoft.Bot.Builder.Azure\Microsoft.Bot.Builder.Azure.csproj", "{B2C5EED9-21B2-4763-AB92-C1995B76DA3A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.QnA.Tests", "tests\Microsoft.Bot.Builder.AI.QnA.Tests\Microsoft.Bot.Builder.AI.QnA.Tests.csproj", "{9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Connector", "libraries\Microsoft.Bot.Connector\Microsoft.Bot.Connector.csproj", "{6462DA5D-27DC-4CD5-9467-5EFB998FD838}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Schema", "libraries\Microsoft.Bot.Schema\Microsoft.Bot.Schema.csproj", "{C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder", "libraries\Microsoft.Bot.Builder\Microsoft.Bot.Builder.csproj", "{ADA8AB8B-2066-4193-B8F7-985669B23E00}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Connector.Tests", "tests\Microsoft.Bot.Connector.Tests\Microsoft.Bot.Connector.Tests.csproj", "{BF414C86-DB3B-4022-9B29-DCE8AA954C12}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Integration", "Integration", "{276EBE79-A13A-46BD-A566-B01DC0477A9B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.Luis", "libraries\Microsoft.Bot.Builder.AI.LUIS\Microsoft.Bot.Builder.AI.Luis.csproj", "{67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.Luis.Tests", "tests\Microsoft.Bot.Builder.AI.LUIS.Tests\Microsoft.Bot.Builder.AI.Luis.Tests.csproj", "{7BCEBDC1-D57F-4717-9B15-4FACD5473489}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integration.AspNet.Core", "libraries\integration\Microsoft.Bot.Builder.Integration.AspNet.Core\Microsoft.Bot.Builder.Integration.AspNet.Core.csproj", "{053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TemplateManager", "libraries\Microsoft.Bot.Builder.TemplateManager\Microsoft.Bot.Builder.TemplateManager.csproj", "{EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TemplateManager.Tests", "tests\Microsoft.Bot.Builder.TemplateManager\Microsoft.Bot.Builder.TemplateManager.Tests.csproj", "{C93F6192-0123-4121-AD92-374A71E4B0F3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Schema.Tests", "tests\Microsoft.Bot.Schema.Tests\Microsoft.Bot.Schema.Tests.csproj", "{A4184239-F13F-4A09-B2D3-0B9532609248}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.QnA", "libraries\Microsoft.Bot.Builder.AI.QnA\Microsoft.Bot.Builder.AI.QnA.csproj", "{D9B2EF5D-0515-460F-948A-2BB70C8DCF62}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AI", "AI", "{763168FA-A590-482C-84D8-2922F7ADB1A2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs", "libraries\Microsoft.Bot.Builder.Dialogs\Microsoft.Bot.Builder.Dialogs.csproj", "{0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Tests\Microsoft.Bot.Builder.Dialogs.Tests.csproj", "{2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Integration", "Integration", "{0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integration.AspNet.Core.Tests", "tests\integration\Microsoft.Bot.Builder.Integration.AspNet.Core.Tests\Microsoft.Bot.Builder.Integration.AspNet.Core.Tests.csproj", "{62C4DC83-3B07-45D7-856E-224FFB368E5F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Tests", "tests\Microsoft.Bot.Builder.Tests\Microsoft.Bot.Builder.Tests.csproj", "{35F9B8A8-1974-4795-930B-5E4980EE85E5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Transcripts.Tests", "tests\Microsoft.Bot.Builder.Transcripts.Tests\Microsoft.Bot.Builder.Transcripts.Tests.csproj", "{71698D71-4C6F-40D5-8BDE-2587514CA21C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Configuration", "libraries\Microsoft.Bot.Configuration\Microsoft.Bot.Configuration.csproj", "{0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Configuration.Tests", "tests\Microsoft.Bot.Configuration.Tests\Microsoft.Bot.Configuration.Tests.csproj", "{1B7920E6-5262-4054-B72D-3A8DBBA057D2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integration.ApplicationInsights.Core", "libraries\integration\Microsoft.Bot.Builder.Integration.ApplicationInsights.Core\Microsoft.Bot.Builder.Integration.ApplicationInsights.Core.csproj", "{8FC920C6-E895-4A17-AB2F-452FAAA36CC8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.ApplicationInsights", "libraries\Microsoft.Bot.Builder.ApplicationInsights\Microsoft.Bot.Builder.ApplicationInsights.csproj", "{B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.ApplicationInsights.Core.Tests", "tests\integration\Microsoft.Bot.ApplicationInsights.Core.Tests\Microsoft.Bot.ApplicationInsights.Core.Tests.csproj", "{3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.ApplicationInsights.Tests", "tests\Microsoft.Bot.Builder.ApplicationInsights.Tests\Microsoft.Bot.Builder.ApplicationInsights.Tests.csproj", "{D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot", "tests\Microsoft.Bot.Builder.TestBot\Microsoft.Bot.Builder.TestBot.csproj", "{C113E0AE-5564-4389-BA39-183A8D574210}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.FunctionalTests", "FunctionalTests\Microsoft.Bot.Builder.FunctionalTests\Microsoft.Bot.Builder.FunctionalTests.csproj", "{B9DDC8CB-8EDF-4D98-913A-22F19E642223}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalTests", "FunctionalTests", "{8667F820-8ADA-4498-91AE-AE95DEE5227E}" - ProjectSection(SolutionItems) = preProject - FunctionalTests\Directory.Build.props = FunctionalTests\Directory.Build.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Testing", "libraries\Microsoft.Bot.Builder.Testing\Microsoft.Bot.Builder.Testing.csproj", "{060F070A-BBFA-490E-BE89-3844C857B771}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Testing.Tests", "tests\Microsoft.Bot.Builder.Testing.Tests\Microsoft.Bot.Builder.Testing.Tests.csproj", "{E4E13301-9193-4106-B0E3-41276B478E7C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot.Tests", "tests\Microsoft.Bot.Builder.TestBot.Tests\Microsoft.Bot.Builder.TestBot.Tests.csproj", "{76391566-9F22-4994-8B0F-02EFC0E9E228}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Declarative", "libraries\Microsoft.Bot.Builder.Dialogs.Declarative\Microsoft.Bot.Builder.Dialogs.Declarative.csproj", "{1BC05915-044E-4776-8956-B44BBEFF2F84}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdaptiveExpressions.Tests", "tests\AdaptiveExpressions.Tests\AdaptiveExpressions.Tests.csproj", "{AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdaptiveExpressions", "libraries\AdaptiveExpressions\AdaptiveExpressions.csproj", "{8DC1257B-7650-40EB-97A2-C1CBA306DA6A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Declarative.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Declarative.Tests\Microsoft.Bot.Builder.Dialogs.Declarative.Tests.csproj", "{D5E70443-4BA2-42ED-992A-010268440B08}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Debugging", "libraries\Microsoft.Bot.Builder.Dialogs.Debugging\Microsoft.Bot.Builder.Dialogs.Debugging.csproj", "{84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.LanguageGeneration", "libraries\Microsoft.Bot.Builder.LanguageGeneration\Microsoft.Bot.Builder.LanguageGeneration.csproj", "{52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Debugging.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Debugging.Tests\Microsoft.Bot.Builder.Dialogs.Debugging.Tests.csproj", "{F59673EA-2D0D-441A-BB85-CD343DE6BE45}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.LanguageGeneration.Tests", "tests\Microsoft.Bot.Builder.LanguageGeneration.Tests\Microsoft.Bot.Builder.LanguageGeneration.Tests.csproj", "{72EE26E2-E8BE-4169-82AD-93E021539C34}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6B6AFE9D-6FA5-4699-B0EB-62335FD431C8}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - bot.png = bot.png - bot_icon.png = bot_icon.png - BotBuilder-DotNet.ruleset = BotBuilder-DotNet.ruleset - CodeCoverage.runsettings = CodeCoverage.runsettings - Directory.Build.props = Directory.Build.props - tests\tests.schema = tests\tests.schema - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot.Json", "tests\Microsoft.Bot.Builder.TestBot.Json\Microsoft.Bot.Builder.TestBot.Json.csproj", "{2454BBCD-77BC-4E3D-B5A6-3562BED898D6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.Luis.TestUtils", "tests\Microsoft.Bot.Builder.AI.Luis.TestUtils\Microsoft.Bot.Builder.AI.Luis.TestUtils.csproj", "{685271A8-6C69-46E4-9B11-89AF9761CE0A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.LuisV3.Tests", "tests\Microsoft.Bot.Builder.Ai.LUISV3.tests\Microsoft.Bot.Builder.AI.LuisV3.Tests.csproj", "{474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Adapters", "Adapters", "{6230B915-B238-4E57-AAC4-06B4498F540F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Twilio", "libraries\Adapters\Microsoft.Bot.Builder.Adapters.Twilio\Microsoft.Bot.Builder.Adapters.Twilio.csproj", "{1D1AD39B-EBCF-4960-930E-84246DEF6AAE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Adapters", "Adapters", "{E8CD434A-306F-41D9-B67D-BFFF3287354D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Twilio.Tests", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Twilio.Tests\Microsoft.Bot.Builder.Adapters.Twilio.Tests.csproj", "{6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integration.ApplicationInsights.WebApi", "libraries\integration\Microsoft.Bot.Builder.Integration.ApplicationInsights.WebApi\Microsoft.Bot.Builder.Integration.ApplicationInsights.WebApi.csproj", "{E0223463-97C6-4108-B5A9-AFBA16B9D5CC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integration.AspNet.WebApi", "libraries\integration\Microsoft.Bot.Builder.Integration.AspNet.WebApi\Microsoft.Bot.Builder.Integration.AspNet.WebApi.csproj", "{EE76BD65-FB01-498F-B053-4E1B2693D85F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Bot.ApplicationInsights.WebApi.Tests", "tests\integration\Microsoft.Bot.ApplicationInsights.WebApi.Tests\Microsoft.Bot.ApplicationInsights.WebApi.Tests.csproj", "{873BCC1F-ED12-424E-93FA-D76F4BA022C2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests", "tests\integration\Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests\Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests.csproj", "{2614D290-1345-4A41-BE90-F85F817CEADE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Webex", "libraries\Adapters\Microsoft.Bot.Builder.Adapters.Webex\Microsoft.Bot.Builder.Adapters.Webex.csproj", "{F3669415-319E-4C4C-A398-89321589B3A9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Webex.Tests", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Webex.Tests\Microsoft.Bot.Builder.Adapters.Webex.Tests.csproj", "{9878B523-BD1E-4285-A875-3CAB4127F7E6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Webex.TestBot", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Webex.TestBot\Microsoft.Bot.Builder.Adapters.Webex.TestBot.csproj", "{6E39C647-902F-4CFF-A4E4-194B295E3AF4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Templates.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Templates.Tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Templates.Tests.csproj", "{EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Streaming", "libraries\Microsoft.Bot.Streaming\Microsoft.Bot.Streaming.csproj", "{4C82FD14-418F-43E4-AC59-3D926B55CEA3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Streaming.Tests", "tests\Microsoft.Bot.Streaming.Tests\Microsoft.Bot.Streaming.Tests.csproj", "{D243AC2D-7823-4177-9D8A-23FDFDA274D2}" - ProjectSection(ProjectDependencies) = postProject - {ADA8AB8B-2066-4193-B8F7-985669B23E00} = {ADA8AB8B-2066-4193-B8F7-985669B23E00} - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Slack", "libraries\Adapters\Microsoft.Bot.Builder.Adapters.Slack\Microsoft.Bot.Builder.Adapters.Slack.csproj", "{D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Slack.TestBot", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Slack.TestBot\Microsoft.Bot.Builder.Adapters.Slack.TestBot.csproj", "{170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Slack.Tests", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Slack.Tests\Microsoft.Bot.Builder.Adapters.Slack.Tests.csproj", "{195FC24B-C4DA-4055-918D-5ABF50FD805B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Facebook.Tests", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Facebook.Tests\Microsoft.Bot.Builder.Adapters.Facebook.Tests.csproj", "{9F7B2BDF-973B-4639-B890-357EB967B2ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot\Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot.csproj", "{E372D54C-73AA-41DB-A471-81348AC37F36}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Facebook", "libraries\Adapters\Microsoft.Bot.Builder.Adapters.Facebook\Microsoft.Bot.Builder.Adapters.Facebook.csproj", "{C8E31CD2-89D4-4659-9557-43EC9C99D984}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Facebook.SecondaryTestBot", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Facebook.SecondaryTestBot\Microsoft.Bot.Builder.Adapters.Facebook.SecondaryTestBot.csproj", "{1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestProtocol", "tests\Microsoft.Bot.Builder.TestProtocol\Microsoft.Bot.Builder.TestProtocol.csproj", "{24CCB459-B4F6-484F-8BA4-946A4AB816FA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Profiling", "tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Profiling\Microsoft.Bot.Builder.Dialogs.Adaptive.Profiling.csproj", "{D9242899-AB3F-46BB-BAB4-386CB8EC535C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Twilio.TestBot", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Twilio.TestBot\Microsoft.Bot.Builder.Adapters.Twilio.TestBot.csproj", "{F98A9787-B175-450F-99FC-EC241EB9D581}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot.NetCore21", "tests\Microsoft.Bot.Builder.TestBot.NetCore21\Microsoft.Bot.Builder.TestBot.NetCore21.csproj", "{99C466C3-1931-4C0E-AA0A-A8D9D140F56E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot.NetCore21.Tests", "tests\Microsoft.Bot.Builder.TestBot.NetCore21.Tests\Microsoft.Bot.Builder.TestBot.NetCore21.Tests.csproj", "{2FBA2BB7-73C8-45CD-99B7-D65F817C9051}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Testing", "libraries\Microsoft.Bot.Builder.Dialogs.Adaptive.Testing\Microsoft.Bot.Builder.Dialogs.Adaptive.Testing.csproj", "{D921D320-0450-455F-8DF2-70EDAC5CCE68}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Skills", "Skills", "{54DA838C-8BB8-4038-8BDB-D887C02B2D9A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Parent", "tests\Skills\Parent\Parent.csproj", "{7F8ED2E7-A4BE-4855-BAF2-95657220E419}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Child", "tests\Skills\Child\Child.csproj", "{1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Teams", "libraries\Microsoft.Bot.Builder.Dialogs.Adaptive.Teams\Microsoft.Bot.Builder.Dialogs.Adaptive.Teams.csproj", "{23BF6935-D648-4874-91C7-1BF4D6FF64E3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Teams.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Teams.Tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Teams.Tests.csproj", "{DD5071A9-BAE1-45EF-814C-D071BE63CD47}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SSO", "SSO", "{AA545986-D3E6-406D-8BD5-305B809FB399}" - ProjectSection(SolutionItems) = preProject - tests\Skills\ReadMeForSSOTesting.md = tests\Skills\ReadMeForSSOTesting.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "End2End", "End2End", "{1024840D-8B5A-4E39-8F6D-F7430DD3749E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bot1", "tests\Skills\Bot1\Bot1.csproj", "{2367D12D-2A9B-4F52-8948-78C1EDE9059A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bot2", "tests\Skills\Bot2\Bot2.csproj", "{36D6E1D7-2506-4096-8D76-55C3CCD32DFE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bot3", "tests\Skills\Bot3\Bot3.csproj", "{85463C41-8D08-4A9D-A475-68A83730431C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.Orchestrator", "libraries\Microsoft.Bot.Builder.AI.Orchestrator\Microsoft.Bot.Builder.AI.Orchestrator.csproj", "{19CE18FD-3F99-4994-B88E-7D32F9303547}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.Orchestrator.Tests", "tests\Microsoft.Bot.Builder.AI.Orchestrator.Tests\Microsoft.Bot.Builder.AI.Orchestrator.Tests.csproj", "{F0033458-4C9D-4D66-B58D-F49ABABE8030}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Azure.Blobs", "libraries\Microsoft.Bot.Builder.Azure.Blobs\Microsoft.Bot.Builder.Azure.Blobs.csproj", "{8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Azure.Queues", "libraries\Microsoft.Bot.Builder.Azure.Queues\Microsoft.Bot.Builder.Azure.Queues.csproj", "{36641924-DE75-4EA9-B139-87F5330D4A09}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug-Windows|Any CPU = Debug-Windows|Any CPU - Release|Any CPU = Release|Any CPU - Release-Windows|Any CPU = Release-Windows|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release|Any CPU.Build.0 = Release|Any CPU - {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release|Any CPU.Build.0 = Release|Any CPU - {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {E325A0E2-716A-49E0-9767-5087CF05727C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E325A0E2-716A-49E0-9767-5087CF05727C}.Release|Any CPU.Build.0 = Release|Any CPU - {E325A0E2-716A-49E0-9767-5087CF05727C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {E325A0E2-716A-49E0-9767-5087CF05727C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release|Any CPU.Build.0 = Release|Any CPU - {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release|Any CPU.Build.0 = Release|Any CPU - {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release|Any CPU.Build.0 = Release|Any CPU - {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release|Any CPU.Build.0 = Release|Any CPU - {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release|Any CPU.Build.0 = Release|Any CPU - {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release|Any CPU.Build.0 = Release|Any CPU - {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release|Any CPU.Build.0 = Release|Any CPU - {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release|Any CPU.Build.0 = Release|Any CPU - {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release|Any CPU.Build.0 = Release|Any CPU - {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release|Any CPU.Build.0 = Release|Any CPU - {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release|Any CPU.Build.0 = Release|Any CPU - {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {A4184239-F13F-4A09-B2D3-0B9532609248}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4184239-F13F-4A09-B2D3-0B9532609248}.Release|Any CPU.Build.0 = Release|Any CPU - {A4184239-F13F-4A09-B2D3-0B9532609248}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {A4184239-F13F-4A09-B2D3-0B9532609248}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release|Any CPU.Build.0 = Release|Any CPU - {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release|Any CPU.Build.0 = Release|Any CPU - {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release|Any CPU.Build.0 = Release|Any CPU - {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release|Any CPU.Build.0 = Release|Any CPU - {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release|Any CPU.Build.0 = Release|Any CPU - {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release|Any CPU.Build.0 = Release|Any CPU - {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release|Any CPU.Build.0 = Release|Any CPU - {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release|Any CPU.Build.0 = Release|Any CPU - {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release|Any CPU.Build.0 = Release|Any CPU - {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release|Any CPU.Build.0 = Release|Any CPU - {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release|Any CPU.Build.0 = Release|Any CPU - {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release|Any CPU.Build.0 = Release|Any CPU - {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {C113E0AE-5564-4389-BA39-183A8D574210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C113E0AE-5564-4389-BA39-183A8D574210}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C113E0AE-5564-4389-BA39-183A8D574210}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {C113E0AE-5564-4389-BA39-183A8D574210}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {C113E0AE-5564-4389-BA39-183A8D574210}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C113E0AE-5564-4389-BA39-183A8D574210}.Release|Any CPU.Build.0 = Release|Any CPU - {C113E0AE-5564-4389-BA39-183A8D574210}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {C113E0AE-5564-4389-BA39-183A8D574210}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release|Any CPU.Build.0 = Release|Any CPU - {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {060F070A-BBFA-490E-BE89-3844C857B771}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {060F070A-BBFA-490E-BE89-3844C857B771}.Debug|Any CPU.Build.0 = Debug|Any CPU - {060F070A-BBFA-490E-BE89-3844C857B771}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {060F070A-BBFA-490E-BE89-3844C857B771}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {060F070A-BBFA-490E-BE89-3844C857B771}.Release|Any CPU.ActiveCfg = Release|Any CPU - {060F070A-BBFA-490E-BE89-3844C857B771}.Release|Any CPU.Build.0 = Release|Any CPU - {060F070A-BBFA-490E-BE89-3844C857B771}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {060F070A-BBFA-490E-BE89-3844C857B771}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {E4E13301-9193-4106-B0E3-41276B478E7C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E4E13301-9193-4106-B0E3-41276B478E7C}.Release|Any CPU.Build.0 = Release|Any CPU - {E4E13301-9193-4106-B0E3-41276B478E7C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {E4E13301-9193-4106-B0E3-41276B478E7C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug|Any CPU.Build.0 = Debug|Any CPU - {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release|Any CPU.ActiveCfg = Release|Any CPU - {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release|Any CPU.Build.0 = Release|Any CPU - {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release|Any CPU.Build.0 = Release|Any CPU - {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release|Any CPU.Build.0 = Release|Any CPU - {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release|Any CPU.Build.0 = Release|Any CPU - {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {D5E70443-4BA2-42ED-992A-010268440B08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5E70443-4BA2-42ED-992A-010268440B08}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5E70443-4BA2-42ED-992A-010268440B08}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {D5E70443-4BA2-42ED-992A-010268440B08}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {D5E70443-4BA2-42ED-992A-010268440B08}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5E70443-4BA2-42ED-992A-010268440B08}.Release|Any CPU.Build.0 = Release|Any CPU - {D5E70443-4BA2-42ED-992A-010268440B08}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {D5E70443-4BA2-42ED-992A-010268440B08}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug|Any CPU.Build.0 = Debug|Any CPU - {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release|Any CPU.ActiveCfg = Release|Any CPU - {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release|Any CPU.Build.0 = Release|Any CPU - {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug|Any CPU.Build.0 = Debug|Any CPU - {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release|Any CPU.ActiveCfg = Release|Any CPU - {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release|Any CPU.Build.0 = Release|Any CPU - {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release|Any CPU.Build.0 = Release|Any CPU - {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release|Any CPU.Build.0 = Release|Any CPU - {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release|Any CPU.Build.0 = Release|Any CPU - {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release|Any CPU.Build.0 = Release|Any CPU - {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release|Any CPU.Build.0 = Release|Any CPU - {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release|Any CPU.Build.0 = Release|Any CPU - {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release|Any CPU.Build.0 = Release|Any CPU - {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {2614D290-1345-4A41-BE90-F85F817CEADE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2614D290-1345-4A41-BE90-F85F817CEADE}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {2614D290-1345-4A41-BE90-F85F817CEADE}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {F3669415-319E-4C4C-A398-89321589B3A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3669415-319E-4C4C-A398-89321589B3A9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3669415-319E-4C4C-A398-89321589B3A9}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {F3669415-319E-4C4C-A398-89321589B3A9}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {F3669415-319E-4C4C-A398-89321589B3A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3669415-319E-4C4C-A398-89321589B3A9}.Release|Any CPU.Build.0 = Release|Any CPU - {F3669415-319E-4C4C-A398-89321589B3A9}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {F3669415-319E-4C4C-A398-89321589B3A9}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release|Any CPU.Build.0 = Release|Any CPU - {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release|Any CPU.Build.0 = Release|Any CPU - {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release|Any CPU.Build.0 = Release|Any CPU - {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release|Any CPU.Build.0 = Release|Any CPU - {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release|Any CPU.Build.0 = Release|Any CPU - {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release|Any CPU.Build.0 = Release|Any CPU - {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug|Any CPU.Build.0 = Debug|Any CPU - {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release|Any CPU.ActiveCfg = Release|Any CPU - {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release|Any CPU.Build.0 = Release|Any CPU - {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release|Any CPU.Build.0 = Release|Any CPU - {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release|Any CPU.Build.0 = Release|Any CPU - {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {E372D54C-73AA-41DB-A471-81348AC37F36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E372D54C-73AA-41DB-A471-81348AC37F36}.Release|Any CPU.Build.0 = Release|Any CPU - {E372D54C-73AA-41DB-A471-81348AC37F36}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {E372D54C-73AA-41DB-A471-81348AC37F36}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release|Any CPU.Build.0 = Release|Any CPU - {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release|Any CPU.Build.0 = Release|Any CPU - {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release|Any CPU.Build.0 = Release|Any CPU - {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release|Any CPU.Build.0 = Release|Any CPU - {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {F98A9787-B175-450F-99FC-EC241EB9D581}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F98A9787-B175-450F-99FC-EC241EB9D581}.Release|Any CPU.Build.0 = Release|Any CPU - {F98A9787-B175-450F-99FC-EC241EB9D581}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {F98A9787-B175-450F-99FC-EC241EB9D581}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release|Any CPU.Build.0 = Release|Any CPU - {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release|Any CPU.Build.0 = Release|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release|Any CPU.Build.0 = Release|Any CPU - {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release|Any CPU.Build.0 = Release|Any CPU - {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release|Any CPU.Build.0 = Release|Any CPU - {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Release|Any CPU.Build.0 = Release|Any CPU - {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Release|Any CPU.Build.0 = Release|Any CPU - {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release|Any CPU.Build.0 = Release|Any CPU - {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release|Any CPU.Build.0 = Release|Any CPU - {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {85463C41-8D08-4A9D-A475-68A83730431C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {85463C41-8D08-4A9D-A475-68A83730431C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {85463C41-8D08-4A9D-A475-68A83730431C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {85463C41-8D08-4A9D-A475-68A83730431C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {85463C41-8D08-4A9D-A475-68A83730431C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {85463C41-8D08-4A9D-A475-68A83730431C}.Release|Any CPU.Build.0 = Release|Any CPU - {85463C41-8D08-4A9D-A475-68A83730431C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {85463C41-8D08-4A9D-A475-68A83730431C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug|Any CPU.ActiveCfg = Debug|x64 - {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug|Any CPU.Build.0 = Debug|x64 - {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug-Windows|Any CPU.ActiveCfg = Debug|x64 - {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug-Windows|Any CPU.Build.0 = Debug|x64 - {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release|Any CPU.ActiveCfg = Release|x64 - {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release|Any CPU.Build.0 = Release|x64 - {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release-Windows|Any CPU.ActiveCfg = Release|x64 - {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release-Windows|Any CPU.Build.0 = Release|x64 - {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release|Any CPU.Build.0 = Release|Any CPU - {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release|Any CPU.Build.0 = Release|Any CPU - {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug|Any CPU.Build.0 = Debug|Any CPU - {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {36641924-DE75-4EA9-B139-87F5330D4A09}.Release|Any CPU.ActiveCfg = Release|Any CPU - {36641924-DE75-4EA9-B139-87F5330D4A09}.Release|Any CPU.Build.0 = Release|Any CPU - {36641924-DE75-4EA9-B139-87F5330D4A09}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {36641924-DE75-4EA9-B139-87F5330D4A09}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {3CF175CF-1AF4-4109-96CB-221684DCED7D} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {E325A0E2-716A-49E0-9767-5087CF05727C} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {B2C5EED9-21B2-4763-AB92-C1995B76DA3A} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {6462DA5D-27DC-4CD5-9467-5EFB998FD838} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {ADA8AB8B-2066-4193-B8F7-985669B23E00} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {BF414C86-DB3B-4022-9B29-DCE8AA954C12} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {276EBE79-A13A-46BD-A566-B01DC0477A9B} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA} = {763168FA-A590-482C-84D8-2922F7ADB1A2} - {7BCEBDC1-D57F-4717-9B15-4FACD5473489} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2} = {276EBE79-A13A-46BD-A566-B01DC0477A9B} - {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {C93F6192-0123-4121-AD92-374A71E4B0F3} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {A4184239-F13F-4A09-B2D3-0B9532609248} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {D9B2EF5D-0515-460F-948A-2BB70C8DCF62} = {763168FA-A590-482C-84D8-2922F7ADB1A2} - {763168FA-A590-482C-84D8-2922F7ADB1A2} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {62C4DC83-3B07-45D7-856E-224FFB368E5F} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} - {35F9B8A8-1974-4795-930B-5E4980EE85E5} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {71698D71-4C6F-40D5-8BDE-2587514CA21C} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {1B7920E6-5262-4054-B72D-3A8DBBA057D2} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {8FC920C6-E895-4A17-AB2F-452FAAA36CC8} = {276EBE79-A13A-46BD-A566-B01DC0477A9B} - {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} - {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {C113E0AE-5564-4389-BA39-183A8D574210} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {B9DDC8CB-8EDF-4D98-913A-22F19E642223} = {8667F820-8ADA-4498-91AE-AE95DEE5227E} - {060F070A-BBFA-490E-BE89-3844C857B771} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {E4E13301-9193-4106-B0E3-41276B478E7C} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {76391566-9F22-4994-8B0F-02EFC0E9E228} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {1BC05915-044E-4776-8956-B44BBEFF2F84} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {8DC1257B-7650-40EB-97A2-C1CBA306DA6A} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {D5E70443-4BA2-42ED-992A-010268440B08} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {F59673EA-2D0D-441A-BB85-CD343DE6BE45} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {72EE26E2-E8BE-4169-82AD-93E021539C34} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {2454BBCD-77BC-4E3D-B5A6-3562BED898D6} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {685271A8-6C69-46E4-9B11-89AF9761CE0A} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {6230B915-B238-4E57-AAC4-06B4498F540F} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {1D1AD39B-EBCF-4960-930E-84246DEF6AAE} = {6230B915-B238-4E57-AAC4-06B4498F540F} - {E8CD434A-306F-41D9-B67D-BFFF3287354D} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} - {E0223463-97C6-4108-B5A9-AFBA16B9D5CC} = {276EBE79-A13A-46BD-A566-B01DC0477A9B} - {EE76BD65-FB01-498F-B053-4E1B2693D85F} = {276EBE79-A13A-46BD-A566-B01DC0477A9B} - {873BCC1F-ED12-424E-93FA-D76F4BA022C2} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} - {2614D290-1345-4A41-BE90-F85F817CEADE} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} - {F3669415-319E-4C4C-A398-89321589B3A9} = {6230B915-B238-4E57-AAC4-06B4498F540F} - {9878B523-BD1E-4285-A875-3CAB4127F7E6} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} - {6E39C647-902F-4CFF-A4E4-194B295E3AF4} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} - {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {4C82FD14-418F-43E4-AC59-3D926B55CEA3} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {D243AC2D-7823-4177-9D8A-23FDFDA274D2} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079} = {6230B915-B238-4E57-AAC4-06B4498F540F} - {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} - {195FC24B-C4DA-4055-918D-5ABF50FD805B} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} - {9F7B2BDF-973B-4639-B890-357EB967B2ED} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} - {E372D54C-73AA-41DB-A471-81348AC37F36} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} - {C8E31CD2-89D4-4659-9557-43EC9C99D984} = {6230B915-B238-4E57-AAC4-06B4498F540F} - {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} - {24CCB459-B4F6-484F-8BA4-946A4AB816FA} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {D9242899-AB3F-46BB-BAB4-386CB8EC535C} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {F98A9787-B175-450F-99FC-EC241EB9D581} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} - {99C466C3-1931-4C0E-AA0A-A8D9D140F56E} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {D921D320-0450-455F-8DF2-70EDAC5CCE68} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {54DA838C-8BB8-4038-8BDB-D887C02B2D9A} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {7F8ED2E7-A4BE-4855-BAF2-95657220E419} = {AA545986-D3E6-406D-8BD5-305B809FB399} - {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3} = {AA545986-D3E6-406D-8BD5-305B809FB399} - {23BF6935-D648-4874-91C7-1BF4D6FF64E3} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {DD5071A9-BAE1-45EF-814C-D071BE63CD47} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {AA545986-D3E6-406D-8BD5-305B809FB399} = {54DA838C-8BB8-4038-8BDB-D887C02B2D9A} - {1024840D-8B5A-4E39-8F6D-F7430DD3749E} = {54DA838C-8BB8-4038-8BDB-D887C02B2D9A} - {2367D12D-2A9B-4F52-8948-78C1EDE9059A} = {1024840D-8B5A-4E39-8F6D-F7430DD3749E} - {36D6E1D7-2506-4096-8D76-55C3CCD32DFE} = {1024840D-8B5A-4E39-8F6D-F7430DD3749E} - {85463C41-8D08-4A9D-A475-68A83730431C} = {1024840D-8B5A-4E39-8F6D-F7430DD3749E} - {19CE18FD-3F99-4994-B88E-7D32F9303547} = {763168FA-A590-482C-84D8-2922F7ADB1A2} - {F0033458-4C9D-4D66-B58D-F49ABABE8030} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - {36641924-DE75-4EA9-B139-87F5330D4A09} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {7173C9F3-A7F9-496E-9078-9156E35D6E16} - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{4269F3C3-6B42-419B-B64A-3E6DC0F1574A}" + ProjectSection(SolutionItems) = preProject + libraries\Directory.Build.props = libraries\Directory.Build.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{AD743B78-D61F-4FBF-B620-FA83CE599A50}" + ProjectSection(SolutionItems) = preProject + tests\Directory.Build.props = tests\Directory.Build.props + tests\tests.schema = tests\tests.schema + tests\update = tests\update + tests\update.cmd = tests\update.cmd + tests\updateTranscripts.cmd = tests\updateTranscripts.cmd + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive", "libraries\Microsoft.Bot.Builder.Dialogs.Adaptive\Microsoft.Bot.Builder.Dialogs.Adaptive.csproj", "{3CF175CF-1AF4-4109-96CB-221684DCED7D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Tests.csproj", "{CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Azure.Tests", "tests\Microsoft.Bot.Builder.Azure.Tests\Microsoft.Bot.Builder.Azure.Tests.csproj", "{E325A0E2-716A-49E0-9767-5087CF05727C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Azure", "libraries\Microsoft.Bot.Builder.Azure\Microsoft.Bot.Builder.Azure.csproj", "{B2C5EED9-21B2-4763-AB92-C1995B76DA3A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.QnA.Tests", "tests\Microsoft.Bot.Builder.AI.QnA.Tests\Microsoft.Bot.Builder.AI.QnA.Tests.csproj", "{9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Connector", "libraries\Microsoft.Bot.Connector\Microsoft.Bot.Connector.csproj", "{6462DA5D-27DC-4CD5-9467-5EFB998FD838}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Schema", "libraries\Microsoft.Bot.Schema\Microsoft.Bot.Schema.csproj", "{C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder", "libraries\Microsoft.Bot.Builder\Microsoft.Bot.Builder.csproj", "{ADA8AB8B-2066-4193-B8F7-985669B23E00}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Connector.Tests", "tests\Microsoft.Bot.Connector.Tests\Microsoft.Bot.Connector.Tests.csproj", "{BF414C86-DB3B-4022-9B29-DCE8AA954C12}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Integration", "Integration", "{276EBE79-A13A-46BD-A566-B01DC0477A9B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.Luis", "libraries\Microsoft.Bot.Builder.AI.LUIS\Microsoft.Bot.Builder.AI.Luis.csproj", "{67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.Luis.Tests", "tests\Microsoft.Bot.Builder.AI.LUIS.Tests\Microsoft.Bot.Builder.AI.Luis.Tests.csproj", "{7BCEBDC1-D57F-4717-9B15-4FACD5473489}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integration.AspNet.Core", "libraries\integration\Microsoft.Bot.Builder.Integration.AspNet.Core\Microsoft.Bot.Builder.Integration.AspNet.Core.csproj", "{053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TemplateManager", "libraries\Microsoft.Bot.Builder.TemplateManager\Microsoft.Bot.Builder.TemplateManager.csproj", "{EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TemplateManager.Tests", "tests\Microsoft.Bot.Builder.TemplateManager\Microsoft.Bot.Builder.TemplateManager.Tests.csproj", "{C93F6192-0123-4121-AD92-374A71E4B0F3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Schema.Tests", "tests\Microsoft.Bot.Schema.Tests\Microsoft.Bot.Schema.Tests.csproj", "{A4184239-F13F-4A09-B2D3-0B9532609248}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.QnA", "libraries\Microsoft.Bot.Builder.AI.QnA\Microsoft.Bot.Builder.AI.QnA.csproj", "{D9B2EF5D-0515-460F-948A-2BB70C8DCF62}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AI", "AI", "{763168FA-A590-482C-84D8-2922F7ADB1A2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs", "libraries\Microsoft.Bot.Builder.Dialogs\Microsoft.Bot.Builder.Dialogs.csproj", "{0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Tests\Microsoft.Bot.Builder.Dialogs.Tests.csproj", "{2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Integration", "Integration", "{0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integration.AspNet.Core.Tests", "tests\integration\Microsoft.Bot.Builder.Integration.AspNet.Core.Tests\Microsoft.Bot.Builder.Integration.AspNet.Core.Tests.csproj", "{62C4DC83-3B07-45D7-856E-224FFB368E5F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Tests", "tests\Microsoft.Bot.Builder.Tests\Microsoft.Bot.Builder.Tests.csproj", "{35F9B8A8-1974-4795-930B-5E4980EE85E5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Transcripts.Tests", "tests\Microsoft.Bot.Builder.Transcripts.Tests\Microsoft.Bot.Builder.Transcripts.Tests.csproj", "{71698D71-4C6F-40D5-8BDE-2587514CA21C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Configuration", "libraries\Microsoft.Bot.Configuration\Microsoft.Bot.Configuration.csproj", "{0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Configuration.Tests", "tests\Microsoft.Bot.Configuration.Tests\Microsoft.Bot.Configuration.Tests.csproj", "{1B7920E6-5262-4054-B72D-3A8DBBA057D2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integration.ApplicationInsights.Core", "libraries\integration\Microsoft.Bot.Builder.Integration.ApplicationInsights.Core\Microsoft.Bot.Builder.Integration.ApplicationInsights.Core.csproj", "{8FC920C6-E895-4A17-AB2F-452FAAA36CC8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.ApplicationInsights", "libraries\Microsoft.Bot.Builder.ApplicationInsights\Microsoft.Bot.Builder.ApplicationInsights.csproj", "{B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.ApplicationInsights.Core.Tests", "tests\integration\Microsoft.Bot.ApplicationInsights.Core.Tests\Microsoft.Bot.ApplicationInsights.Core.Tests.csproj", "{3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.ApplicationInsights.Tests", "tests\Microsoft.Bot.Builder.ApplicationInsights.Tests\Microsoft.Bot.Builder.ApplicationInsights.Tests.csproj", "{D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot", "tests\Microsoft.Bot.Builder.TestBot\Microsoft.Bot.Builder.TestBot.csproj", "{C113E0AE-5564-4389-BA39-183A8D574210}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.FunctionalTests", "FunctionalTests\Microsoft.Bot.Builder.FunctionalTests\Microsoft.Bot.Builder.FunctionalTests.csproj", "{B9DDC8CB-8EDF-4D98-913A-22F19E642223}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalTests", "FunctionalTests", "{8667F820-8ADA-4498-91AE-AE95DEE5227E}" + ProjectSection(SolutionItems) = preProject + FunctionalTests\Directory.Build.props = FunctionalTests\Directory.Build.props + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Testing", "libraries\Microsoft.Bot.Builder.Testing\Microsoft.Bot.Builder.Testing.csproj", "{060F070A-BBFA-490E-BE89-3844C857B771}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Testing.Tests", "tests\Microsoft.Bot.Builder.Testing.Tests\Microsoft.Bot.Builder.Testing.Tests.csproj", "{E4E13301-9193-4106-B0E3-41276B478E7C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot.Tests", "tests\Microsoft.Bot.Builder.TestBot.Tests\Microsoft.Bot.Builder.TestBot.Tests.csproj", "{76391566-9F22-4994-8B0F-02EFC0E9E228}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Declarative", "libraries\Microsoft.Bot.Builder.Dialogs.Declarative\Microsoft.Bot.Builder.Dialogs.Declarative.csproj", "{1BC05915-044E-4776-8956-B44BBEFF2F84}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdaptiveExpressions.Tests", "tests\AdaptiveExpressions.Tests\AdaptiveExpressions.Tests.csproj", "{AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdaptiveExpressions", "libraries\AdaptiveExpressions\AdaptiveExpressions.csproj", "{8DC1257B-7650-40EB-97A2-C1CBA306DA6A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Declarative.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Declarative.Tests\Microsoft.Bot.Builder.Dialogs.Declarative.Tests.csproj", "{D5E70443-4BA2-42ED-992A-010268440B08}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Debugging", "libraries\Microsoft.Bot.Builder.Dialogs.Debugging\Microsoft.Bot.Builder.Dialogs.Debugging.csproj", "{84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.LanguageGeneration", "libraries\Microsoft.Bot.Builder.LanguageGeneration\Microsoft.Bot.Builder.LanguageGeneration.csproj", "{52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Debugging.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Debugging.Tests\Microsoft.Bot.Builder.Dialogs.Debugging.Tests.csproj", "{F59673EA-2D0D-441A-BB85-CD343DE6BE45}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.LanguageGeneration.Tests", "tests\Microsoft.Bot.Builder.LanguageGeneration.Tests\Microsoft.Bot.Builder.LanguageGeneration.Tests.csproj", "{72EE26E2-E8BE-4169-82AD-93E021539C34}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6B6AFE9D-6FA5-4699-B0EB-62335FD431C8}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + bot.png = bot.png + bot_icon.png = bot_icon.png + BotBuilder-DotNet.ruleset = BotBuilder-DotNet.ruleset + CodeCoverage.runsettings = CodeCoverage.runsettings + Directory.Build.props = Directory.Build.props + tests\tests.schema = tests\tests.schema + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot.Json", "tests\Microsoft.Bot.Builder.TestBot.Json\Microsoft.Bot.Builder.TestBot.Json.csproj", "{2454BBCD-77BC-4E3D-B5A6-3562BED898D6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.Luis.TestUtils", "tests\Microsoft.Bot.Builder.AI.Luis.TestUtils\Microsoft.Bot.Builder.AI.Luis.TestUtils.csproj", "{685271A8-6C69-46E4-9B11-89AF9761CE0A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.LuisV3.Tests", "tests\Microsoft.Bot.Builder.Ai.LUISV3.tests\Microsoft.Bot.Builder.AI.LuisV3.Tests.csproj", "{474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Adapters", "Adapters", "{6230B915-B238-4E57-AAC4-06B4498F540F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Twilio", "libraries\Adapters\Microsoft.Bot.Builder.Adapters.Twilio\Microsoft.Bot.Builder.Adapters.Twilio.csproj", "{1D1AD39B-EBCF-4960-930E-84246DEF6AAE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Adapters", "Adapters", "{E8CD434A-306F-41D9-B67D-BFFF3287354D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Twilio.Tests", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Twilio.Tests\Microsoft.Bot.Builder.Adapters.Twilio.Tests.csproj", "{6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integration.ApplicationInsights.WebApi", "libraries\integration\Microsoft.Bot.Builder.Integration.ApplicationInsights.WebApi\Microsoft.Bot.Builder.Integration.ApplicationInsights.WebApi.csproj", "{E0223463-97C6-4108-B5A9-AFBA16B9D5CC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Integration.AspNet.WebApi", "libraries\integration\Microsoft.Bot.Builder.Integration.AspNet.WebApi\Microsoft.Bot.Builder.Integration.AspNet.WebApi.csproj", "{EE76BD65-FB01-498F-B053-4E1B2693D85F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Bot.ApplicationInsights.WebApi.Tests", "tests\integration\Microsoft.Bot.ApplicationInsights.WebApi.Tests\Microsoft.Bot.ApplicationInsights.WebApi.Tests.csproj", "{873BCC1F-ED12-424E-93FA-D76F4BA022C2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests", "tests\integration\Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests\Microsoft.Bot.Builder.Integration.AspNet.WebApi.Tests.csproj", "{2614D290-1345-4A41-BE90-F85F817CEADE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Webex", "libraries\Adapters\Microsoft.Bot.Builder.Adapters.Webex\Microsoft.Bot.Builder.Adapters.Webex.csproj", "{F3669415-319E-4C4C-A398-89321589B3A9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Webex.Tests", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Webex.Tests\Microsoft.Bot.Builder.Adapters.Webex.Tests.csproj", "{9878B523-BD1E-4285-A875-3CAB4127F7E6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Webex.TestBot", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Webex.TestBot\Microsoft.Bot.Builder.Adapters.Webex.TestBot.csproj", "{6E39C647-902F-4CFF-A4E4-194B295E3AF4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Templates.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Templates.Tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Templates.Tests.csproj", "{EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Streaming", "libraries\Microsoft.Bot.Streaming\Microsoft.Bot.Streaming.csproj", "{4C82FD14-418F-43E4-AC59-3D926B55CEA3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Streaming.Tests", "tests\Microsoft.Bot.Streaming.Tests\Microsoft.Bot.Streaming.Tests.csproj", "{D243AC2D-7823-4177-9D8A-23FDFDA274D2}" + ProjectSection(ProjectDependencies) = postProject + {ADA8AB8B-2066-4193-B8F7-985669B23E00} = {ADA8AB8B-2066-4193-B8F7-985669B23E00} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Slack", "libraries\Adapters\Microsoft.Bot.Builder.Adapters.Slack\Microsoft.Bot.Builder.Adapters.Slack.csproj", "{D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Slack.TestBot", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Slack.TestBot\Microsoft.Bot.Builder.Adapters.Slack.TestBot.csproj", "{170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Slack.Tests", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Slack.Tests\Microsoft.Bot.Builder.Adapters.Slack.Tests.csproj", "{195FC24B-C4DA-4055-918D-5ABF50FD805B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Facebook.Tests", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Facebook.Tests\Microsoft.Bot.Builder.Adapters.Facebook.Tests.csproj", "{9F7B2BDF-973B-4639-B890-357EB967B2ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot\Microsoft.Bot.Builder.Adapters.Facebook.PrimaryTestBot.csproj", "{E372D54C-73AA-41DB-A471-81348AC37F36}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Facebook", "libraries\Adapters\Microsoft.Bot.Builder.Adapters.Facebook\Microsoft.Bot.Builder.Adapters.Facebook.csproj", "{C8E31CD2-89D4-4659-9557-43EC9C99D984}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Facebook.SecondaryTestBot", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Facebook.SecondaryTestBot\Microsoft.Bot.Builder.Adapters.Facebook.SecondaryTestBot.csproj", "{1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestProtocol", "tests\Microsoft.Bot.Builder.TestProtocol\Microsoft.Bot.Builder.TestProtocol.csproj", "{24CCB459-B4F6-484F-8BA4-946A4AB816FA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Profiling", "tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Profiling\Microsoft.Bot.Builder.Dialogs.Adaptive.Profiling.csproj", "{D9242899-AB3F-46BB-BAB4-386CB8EC535C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapters.Twilio.TestBot", "tests\Adapters\Microsoft.Bot.Builder.Adapters.Twilio.TestBot\Microsoft.Bot.Builder.Adapters.Twilio.TestBot.csproj", "{F98A9787-B175-450F-99FC-EC241EB9D581}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot.NetCore21", "tests\Microsoft.Bot.Builder.TestBot.NetCore21\Microsoft.Bot.Builder.TestBot.NetCore21.csproj", "{99C466C3-1931-4C0E-AA0A-A8D9D140F56E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot.NetCore21.Tests", "tests\Microsoft.Bot.Builder.TestBot.NetCore21.Tests\Microsoft.Bot.Builder.TestBot.NetCore21.Tests.csproj", "{2FBA2BB7-73C8-45CD-99B7-D65F817C9051}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Testing", "libraries\Microsoft.Bot.Builder.Dialogs.Adaptive.Testing\Microsoft.Bot.Builder.Dialogs.Adaptive.Testing.csproj", "{D921D320-0450-455F-8DF2-70EDAC5CCE68}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Skills", "Skills", "{54DA838C-8BB8-4038-8BDB-D887C02B2D9A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Parent", "tests\Skills\Parent\Parent.csproj", "{7F8ED2E7-A4BE-4855-BAF2-95657220E419}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Child", "tests\Skills\Child\Child.csproj", "{1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Teams", "libraries\Microsoft.Bot.Builder.Dialogs.Adaptive.Teams\Microsoft.Bot.Builder.Dialogs.Adaptive.Teams.csproj", "{23BF6935-D648-4874-91C7-1BF4D6FF64E3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Teams.Tests", "tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Teams.Tests\Microsoft.Bot.Builder.Dialogs.Adaptive.Teams.Tests.csproj", "{DD5071A9-BAE1-45EF-814C-D071BE63CD47}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SSO", "SSO", "{AA545986-D3E6-406D-8BD5-305B809FB399}" + ProjectSection(SolutionItems) = preProject + tests\Skills\ReadMeForSSOTesting.md = tests\Skills\ReadMeForSSOTesting.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "End2End", "End2End", "{1024840D-8B5A-4E39-8F6D-F7430DD3749E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bot1", "tests\Skills\Bot1\Bot1.csproj", "{2367D12D-2A9B-4F52-8948-78C1EDE9059A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bot2", "tests\Skills\Bot2\Bot2.csproj", "{36D6E1D7-2506-4096-8D76-55C3CCD32DFE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bot3", "tests\Skills\Bot3\Bot3.csproj", "{85463C41-8D08-4A9D-A475-68A83730431C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.Orchestrator", "libraries\Microsoft.Bot.Builder.AI.Orchestrator\Microsoft.Bot.Builder.AI.Orchestrator.csproj", "{19CE18FD-3F99-4994-B88E-7D32F9303547}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.AI.Orchestrator.Tests", "tests\Microsoft.Bot.Builder.AI.Orchestrator.Tests\Microsoft.Bot.Builder.AI.Orchestrator.Tests.csproj", "{F0033458-4C9D-4D66-B58D-F49ABABE8030}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Azure.Blobs", "libraries\Microsoft.Bot.Builder.Azure.Blobs\Microsoft.Bot.Builder.Azure.Blobs.csproj", "{8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Azure.Queues", "libraries\Microsoft.Bot.Builder.Azure.Queues\Microsoft.Bot.Builder.Azure.Queues.csproj", "{36641924-DE75-4EA9-B139-87F5330D4A09}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Bot.Builder.TestBot.Shared", "tests\Microsoft.Bot.Builder.TestBot.Shared\Microsoft.Bot.Builder.TestBot.Shared.csproj", "{92F88315-B33B-4D8C-AD8E-9E94CADC867F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug-Windows|Any CPU = Debug-Windows|Any CPU + Release|Any CPU = Release|Any CPU + Release-Windows|Any CPU = Release-Windows|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release|Any CPU.Build.0 = Release|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {3CF175CF-1AF4-4109-96CB-221684DCED7D}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release|Any CPU.Build.0 = Release|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Release|Any CPU.Build.0 = Release|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {E325A0E2-716A-49E0-9767-5087CF05727C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release|Any CPU.Build.0 = Release|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release|Any CPU.Build.0 = Release|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release|Any CPU.Build.0 = Release|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {6462DA5D-27DC-4CD5-9467-5EFB998FD838}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release|Any CPU.Build.0 = Release|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release|Any CPU.Build.0 = Release|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {ADA8AB8B-2066-4193-B8F7-985669B23E00}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release|Any CPU.Build.0 = Release|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {BF414C86-DB3B-4022-9B29-DCE8AA954C12}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release|Any CPU.Build.0 = Release|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release|Any CPU.Build.0 = Release|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {7BCEBDC1-D57F-4717-9B15-4FACD5473489}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release|Any CPU.Build.0 = Release|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release|Any CPU.Build.0 = Release|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release|Any CPU.Build.0 = Release|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {C93F6192-0123-4121-AD92-374A71E4B0F3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Release|Any CPU.Build.0 = Release|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {A4184239-F13F-4A09-B2D3-0B9532609248}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release|Any CPU.Build.0 = Release|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release|Any CPU.Build.0 = Release|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release|Any CPU.Build.0 = Release|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release|Any CPU.Build.0 = Release|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {62C4DC83-3B07-45D7-856E-224FFB368E5F}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release|Any CPU.Build.0 = Release|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {35F9B8A8-1974-4795-930B-5E4980EE85E5}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release|Any CPU.Build.0 = Release|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {71698D71-4C6F-40D5-8BDE-2587514CA21C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release|Any CPU.Build.0 = Release|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release|Any CPU.Build.0 = Release|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {1B7920E6-5262-4054-B72D-3A8DBBA057D2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release|Any CPU.Build.0 = Release|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release|Any CPU.Build.0 = Release|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release|Any CPU.Build.0 = Release|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release|Any CPU.Build.0 = Release|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Release|Any CPU.Build.0 = Release|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {C113E0AE-5564-4389-BA39-183A8D574210}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release|Any CPU.Build.0 = Release|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {B9DDC8CB-8EDF-4D98-913A-22F19E642223}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Debug|Any CPU.Build.0 = Debug|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Release|Any CPU.ActiveCfg = Release|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Release|Any CPU.Build.0 = Release|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {060F070A-BBFA-490E-BE89-3844C857B771}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Release|Any CPU.Build.0 = Release|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {E4E13301-9193-4106-B0E3-41276B478E7C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release|Any CPU.Build.0 = Release|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {76391566-9F22-4994-8B0F-02EFC0E9E228}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release|Any CPU.Build.0 = Release|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {1BC05915-044E-4776-8956-B44BBEFF2F84}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release|Any CPU.Build.0 = Release|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release|Any CPU.Build.0 = Release|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Release|Any CPU.Build.0 = Release|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {D5E70443-4BA2-42ED-992A-010268440B08}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release|Any CPU.Build.0 = Release|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release|Any CPU.ActiveCfg = Release|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release|Any CPU.Build.0 = Release|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release|Any CPU.Build.0 = Release|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {F59673EA-2D0D-441A-BB85-CD343DE6BE45}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release|Any CPU.ActiveCfg = Release|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release|Any CPU.Build.0 = Release|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {72EE26E2-E8BE-4169-82AD-93E021539C34}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release|Any CPU.Build.0 = Release|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release|Any CPU.Build.0 = Release|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {685271A8-6C69-46E4-9B11-89AF9761CE0A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release|Any CPU.Build.0 = Release|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release|Any CPU.Build.0 = Release|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release|Any CPU.Build.0 = Release|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {EE76BD65-FB01-498F-B053-4E1B2693D85F}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {873BCC1F-ED12-424E-93FA-D76F4BA022C2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {2614D290-1345-4A41-BE90-F85F817CEADE}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2614D290-1345-4A41-BE90-F85F817CEADE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2614D290-1345-4A41-BE90-F85F817CEADE}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {2614D290-1345-4A41-BE90-F85F817CEADE}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Release|Any CPU.Build.0 = Release|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {F3669415-319E-4C4C-A398-89321589B3A9}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release|Any CPU.Build.0 = Release|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {9878B523-BD1E-4285-A875-3CAB4127F7E6}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release|Any CPU.Build.0 = Release|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {6E39C647-902F-4CFF-A4E4-194B295E3AF4}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release|Any CPU.Build.0 = Release|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release|Any CPU.Build.0 = Release|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {4C82FD14-418F-43E4-AC59-3D926B55CEA3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release|Any CPU.Build.0 = Release|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {D243AC2D-7823-4177-9D8A-23FDFDA274D2}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release|Any CPU.Build.0 = Release|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release|Any CPU.Build.0 = Release|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release|Any CPU.Build.0 = Release|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {195FC24B-C4DA-4055-918D-5ABF50FD805B}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release|Any CPU.Build.0 = Release|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {9F7B2BDF-973B-4639-B890-357EB967B2ED}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Release|Any CPU.Build.0 = Release|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {E372D54C-73AA-41DB-A471-81348AC37F36}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release|Any CPU.Build.0 = Release|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {C8E31CD2-89D4-4659-9557-43EC9C99D984}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release|Any CPU.Build.0 = Release|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release|Any CPU.Build.0 = Release|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {24CCB459-B4F6-484F-8BA4-946A4AB816FA}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release|Any CPU.Build.0 = Release|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {D9242899-AB3F-46BB-BAB4-386CB8EC535C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Release|Any CPU.Build.0 = Release|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {F98A9787-B175-450F-99FC-EC241EB9D581}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release|Any CPU.Build.0 = Release|Any CPU + {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release|Any CPU.Build.0 = Release|Any CPU + {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release|Any CPU.Build.0 = Release|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release|Any CPU.Build.0 = Release|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {7F8ED2E7-A4BE-4855-BAF2-95657220E419}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release|Any CPU.Build.0 = Release|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Release|Any CPU.Build.0 = Release|Any CPU + {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {23BF6935-D648-4874-91C7-1BF4D6FF64E3}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Release|Any CPU.Build.0 = Release|Any CPU + {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {DD5071A9-BAE1-45EF-814C-D071BE63CD47}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release|Any CPU.Build.0 = Release|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {2367D12D-2A9B-4F52-8948-78C1EDE9059A}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release|Any CPU.Build.0 = Release|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Release|Any CPU.Build.0 = Release|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {85463C41-8D08-4A9D-A475-68A83730431C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug|Any CPU.ActiveCfg = Debug|x64 + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug|Any CPU.Build.0 = Debug|x64 + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug-Windows|Any CPU.ActiveCfg = Debug|x64 + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Debug-Windows|Any CPU.Build.0 = Debug|x64 + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release|Any CPU.ActiveCfg = Release|x64 + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release|Any CPU.Build.0 = Release|x64 + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release-Windows|Any CPU.ActiveCfg = Release|x64 + {19CE18FD-3F99-4994-B88E-7D32F9303547}.Release-Windows|Any CPU.Build.0 = Release|x64 + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release|Any CPU.Build.0 = Release|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {F0033458-4C9D-4D66-B58D-F49ABABE8030}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release|Any CPU.Build.0 = Release|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Release|Any CPU.Build.0 = Release|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {36641924-DE75-4EA9-B139-87F5330D4A09}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release|Any CPU.Build.0 = Release|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU + {92F88315-B33B-4D8C-AD8E-9E94CADC867F}.Release-Windows|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {3CF175CF-1AF4-4109-96CB-221684DCED7D} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {CA008713-655E-46DA-BBDF-1EF6B8CE7DCA} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {E325A0E2-716A-49E0-9767-5087CF05727C} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {B2C5EED9-21B2-4763-AB92-C1995B76DA3A} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {9BDF7020-A19F-4C6C-B329-E4BFEFF6DE6B} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {6462DA5D-27DC-4CD5-9467-5EFB998FD838} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {C1F54CDC-AD1D-45BB-8F7D-F49E411AFAF1} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {ADA8AB8B-2066-4193-B8F7-985669B23E00} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {BF414C86-DB3B-4022-9B29-DCE8AA954C12} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {276EBE79-A13A-46BD-A566-B01DC0477A9B} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {67AA3C00-E2C5-4D13-BA5E-72EB0E5B8DAA} = {763168FA-A590-482C-84D8-2922F7ADB1A2} + {7BCEBDC1-D57F-4717-9B15-4FACD5473489} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {053BD8B8-B5C1-4C45-81D4-C9BA8D5B3CE2} = {276EBE79-A13A-46BD-A566-B01DC0477A9B} + {EED5F0D3-6F00-4ED1-9108-5ADCB10A3734} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {C93F6192-0123-4121-AD92-374A71E4B0F3} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {A4184239-F13F-4A09-B2D3-0B9532609248} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {D9B2EF5D-0515-460F-948A-2BB70C8DCF62} = {763168FA-A590-482C-84D8-2922F7ADB1A2} + {763168FA-A590-482C-84D8-2922F7ADB1A2} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {0F639EB4-FB64-4909-8A10-FB93E7BE3AFB} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {2F77CA1D-E6F0-4DEA-96BB-8A039F4D0FF8} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {62C4DC83-3B07-45D7-856E-224FFB368E5F} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} + {35F9B8A8-1974-4795-930B-5E4980EE85E5} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {71698D71-4C6F-40D5-8BDE-2587514CA21C} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {0B8ABFDB-F9CF-4EC6-988E-9C32D9E01C26} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {1B7920E6-5262-4054-B72D-3A8DBBA057D2} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {8FC920C6-E895-4A17-AB2F-452FAAA36CC8} = {276EBE79-A13A-46BD-A566-B01DC0477A9B} + {B609DB2C-5C1F-46D1-A0FA-A0FF9216899A} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {3F4A0DD8-4D47-4B9C-939A-3146E68C84F7} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} + {D790A4BB-D8AC-4AAE-B3FE-0CF432CA8031} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {C113E0AE-5564-4389-BA39-183A8D574210} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {B9DDC8CB-8EDF-4D98-913A-22F19E642223} = {8667F820-8ADA-4498-91AE-AE95DEE5227E} + {060F070A-BBFA-490E-BE89-3844C857B771} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {E4E13301-9193-4106-B0E3-41276B478E7C} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {76391566-9F22-4994-8B0F-02EFC0E9E228} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {1BC05915-044E-4776-8956-B44BBEFF2F84} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {AE3FC7F6-B212-4438-B1D7-C121BB4C15ED} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {8DC1257B-7650-40EB-97A2-C1CBA306DA6A} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {D5E70443-4BA2-42ED-992A-010268440B08} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {84E3B6A2-42D9-498A-9CD2-1C5F5BE0D526} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {52CDBBA9-E5AF-433C-80F0-5EF3C8B14946} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {F59673EA-2D0D-441A-BB85-CD343DE6BE45} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {72EE26E2-E8BE-4169-82AD-93E021539C34} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {2454BBCD-77BC-4E3D-B5A6-3562BED898D6} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {685271A8-6C69-46E4-9B11-89AF9761CE0A} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {474C57B1-C9FC-4B71-A92B-B25BA27FAFA7} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {6230B915-B238-4E57-AAC4-06B4498F540F} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {1D1AD39B-EBCF-4960-930E-84246DEF6AAE} = {6230B915-B238-4E57-AAC4-06B4498F540F} + {E8CD434A-306F-41D9-B67D-BFFF3287354D} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {6B51F54F-86E8-4FBC-8FDD-3C386E97D0E1} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} + {E0223463-97C6-4108-B5A9-AFBA16B9D5CC} = {276EBE79-A13A-46BD-A566-B01DC0477A9B} + {EE76BD65-FB01-498F-B053-4E1B2693D85F} = {276EBE79-A13A-46BD-A566-B01DC0477A9B} + {873BCC1F-ED12-424E-93FA-D76F4BA022C2} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} + {2614D290-1345-4A41-BE90-F85F817CEADE} = {0A0E26B0-7A46-4F1A-8BFE-9A763FDF6CF8} + {F3669415-319E-4C4C-A398-89321589B3A9} = {6230B915-B238-4E57-AAC4-06B4498F540F} + {9878B523-BD1E-4285-A875-3CAB4127F7E6} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} + {6E39C647-902F-4CFF-A4E4-194B295E3AF4} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} + {EFAA1D3D-3102-4307-A5DD-EAB4DB9B0386} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {4C82FD14-418F-43E4-AC59-3D926B55CEA3} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {D243AC2D-7823-4177-9D8A-23FDFDA274D2} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {D2D9931A-EBFC-4923-A7BC-EF8BBD76D079} = {6230B915-B238-4E57-AAC4-06B4498F540F} + {170EA6A3-26A6-4A1A-A6F9-44BE5208FA06} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} + {195FC24B-C4DA-4055-918D-5ABF50FD805B} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} + {9F7B2BDF-973B-4639-B890-357EB967B2ED} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} + {E372D54C-73AA-41DB-A471-81348AC37F36} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} + {C8E31CD2-89D4-4659-9557-43EC9C99D984} = {6230B915-B238-4E57-AAC4-06B4498F540F} + {1D05EFE4-7F25-4D5A-BCEE-1109B9EF25A8} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} + {24CCB459-B4F6-484F-8BA4-946A4AB816FA} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {D9242899-AB3F-46BB-BAB4-386CB8EC535C} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {F98A9787-B175-450F-99FC-EC241EB9D581} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} + {99C466C3-1931-4C0E-AA0A-A8D9D140F56E} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {2FBA2BB7-73C8-45CD-99B7-D65F817C9051} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {D921D320-0450-455F-8DF2-70EDAC5CCE68} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {54DA838C-8BB8-4038-8BDB-D887C02B2D9A} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {7F8ED2E7-A4BE-4855-BAF2-95657220E419} = {AA545986-D3E6-406D-8BD5-305B809FB399} + {1958FBA4-BF2D-48D9-A5DB-8915F553EBD3} = {AA545986-D3E6-406D-8BD5-305B809FB399} + {23BF6935-D648-4874-91C7-1BF4D6FF64E3} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {DD5071A9-BAE1-45EF-814C-D071BE63CD47} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {AA545986-D3E6-406D-8BD5-305B809FB399} = {54DA838C-8BB8-4038-8BDB-D887C02B2D9A} + {1024840D-8B5A-4E39-8F6D-F7430DD3749E} = {54DA838C-8BB8-4038-8BDB-D887C02B2D9A} + {2367D12D-2A9B-4F52-8948-78C1EDE9059A} = {1024840D-8B5A-4E39-8F6D-F7430DD3749E} + {36D6E1D7-2506-4096-8D76-55C3CCD32DFE} = {1024840D-8B5A-4E39-8F6D-F7430DD3749E} + {85463C41-8D08-4A9D-A475-68A83730431C} = {1024840D-8B5A-4E39-8F6D-F7430DD3749E} + {19CE18FD-3F99-4994-B88E-7D32F9303547} = {763168FA-A590-482C-84D8-2922F7ADB1A2} + {F0033458-4C9D-4D66-B58D-F49ABABE8030} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + {8EDAA935-DAA1-4E00-9596-7E40D8C0F58C} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {36641924-DE75-4EA9-B139-87F5330D4A09} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} + {92F88315-B33B-4D8C-AD8E-9E94CADC867F} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7173C9F3-A7F9-496E-9078-9156E35D6E16} + EndGlobalSection +EndGlobal diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/BookingDetails.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/BookingDetails.cs new file mode 100644 index 0000000000..0e1f93e579 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/BookingDetails.cs @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.Bot.Builder.TestBot.Shared +{ + public class BookingDetails + { + public string Destination { get; set; } + + public string Origin { get; set; } + + public string TravelDate { get; set; } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/DialogAndWelcomeBot.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/DialogAndWelcomeBot.cs new file mode 100644 index 0000000000..2bd8ffb165 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/DialogAndWelcomeBot.cs @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Schema; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Bots +{ + public class DialogAndWelcomeBot : DialogBot + where T : Dialog + { + public DialogAndWelcomeBot(ConversationState conversationState, UserState userState, T dialog, ILogger> logger) + : base(conversationState, userState, dialog, logger) + { + } + + protected override async Task OnMembersAddedAsync(IList membersAdded, ITurnContext turnContext, CancellationToken cancellationToken) + { + foreach (var member in membersAdded) + { + // Greet anyone that was not the target (recipient) of this message. + // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details. + if (member.Id != turnContext.Activity.Recipient.Id) + { + var welcomeCard = CreateAdaptiveCardAttachment(); + var response = CreateResponse(turnContext.Activity, welcomeCard); + await turnContext.SendActivityAsync(response, cancellationToken); + await Dialog.Run(turnContext, ConversationState.CreateProperty("DialogState"), cancellationToken); + } + } + } + + // Load attachment from embedded resource. + private Attachment CreateAdaptiveCardAttachment() + { + var rootNamespace = typeof(UserProfile).Namespace; + var cardResourcePath = $"{rootNamespace}.Cards.welcomeCard.json"; + + using (var stream = GetType().Assembly.GetManifestResourceStream(cardResourcePath)) + { + using (var reader = new StreamReader(stream)) + { + var adaptiveCard = reader.ReadToEnd(); + return new Attachment() + { + ContentType = "application/vnd.microsoft.card.adaptive", + Content = JsonConvert.DeserializeObject(adaptiveCard), + }; + } + } + } + + // Create an attachment message response. + private Activity CreateResponse(IActivity activity, Attachment attachment) + { + var response = ((Activity)activity).CreateReply(); + response.Attachments = new List() { attachment }; + return response; + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/DialogBot.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/DialogBot.cs new file mode 100644 index 0000000000..aeea2c74fe --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/DialogBot.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Schema; +using Microsoft.Extensions.Logging; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Bots +{ + // This IBot implementation can run any type of Dialog. The use of type parameterization is to allows multiple different bots + // to be run at different endpoints within the same project. This can be achieved by defining distinct Controller types + // each with dependency on distinct IBot types, this way ASP Dependency Injection can glue everything together without ambiguity. + // The ConversationState is used by the Dialog system. The UserState isn't, however, it might have been used in a Dialog implementation, + // and the requirement is that all BotState objects are saved at the end of a turn. + public class DialogBot : ActivityHandler + where T : Dialog + { + public DialogBot(ConversationState conversationState, UserState userState, T dialog, ILogger> logger) + { + ConversationState = conversationState; + UserState = userState; + Dialog = dialog; + Logger = logger; + } + + protected Dialog Dialog { get; } + + protected BotState ConversationState { get; } + + protected BotState UserState { get; } + + protected ILogger Logger { get; } + + public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)) + { + await base.OnTurnAsync(turnContext, cancellationToken); + + // Save any state changes that might have occurred during the turn. + await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken); + await UserState.SaveChangesAsync(turnContext, false, cancellationToken); + } + + protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) + { + Logger.LogInformation("Running dialog with Message Activity."); + + // Run the Dialog with the new message Activity. + await Dialog.Run(turnContext, ConversationState.CreateProperty("DialogState"), cancellationToken); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/MyBot.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/MyBot.cs new file mode 100644 index 0000000000..efa57991fc --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Bots/MyBot.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Schema; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Bots +{ + public class MyBot : ActivityHandler + { + protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) + { + await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text}"), cancellationToken); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Cards/welcomeCard.json b/tests/Microsoft.Bot.Builder.TestBot.Shared/Cards/welcomeCard.json new file mode 100644 index 0000000000..659bf965a9 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Cards/welcomeCard.json @@ -0,0 +1,46 @@ +{ + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "type": "AdaptiveCard", + "version": "1.0", + "body": [ + { + "type": "Image", + "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU", + "size": "stretch" + }, + { + "type": "TextBlock", + "spacing": "medium", + "size": "default", + "weight": "bolder", + "text": "Welcome to Bot Framework!", + "wrap": true, + "maxLines": 0 + }, + { + "type": "TextBlock", + "size": "default", + "isSubtle": "yes", + "text": "Now that you have successfully run your bot, follow the links in this Adaptive Card to expand your knowledge of Bot Framework.", + "wrap": true, + "maxLines": 0 + } + ], + "actions": [ + { + "type": "Action.OpenUrl", + "title": "Get an overview", + "url": "https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0" + }, + { + "type": "Action.OpenUrl", + "title": "Ask a question", + "url": "https://stackoverflow.com/questions/tagged/botframework" + }, + { + "type": "Action.OpenUrl", + "title": "Learn how to deploy", + "url": "https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-deploy-azure?view=azure-bot-service-4.0" + } + ] +} \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/CognitiveModels/FlightBooking.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/CognitiveModels/FlightBooking.cs new file mode 100644 index 0000000000..2dfdcd10cb --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/CognitiveModels/FlightBooking.cs @@ -0,0 +1,100 @@ +// +// Code generated by LUISGen C:\Projects\Repos\botbuilder-dotnet\tests\Microsoft.Bot.Builder.TestBot\CognitiveModels\FlightBooking.json -cs Microsoft.BotBuilderSamples.CognitiveModels.FlightBooking -o C:\Projects\Repos\botbuilder-dotnet\tests\Microsoft.Bot.Builder.TestBot\CognitiveModels +// Tool github: https://github.com/microsoft/botbuilder-tools +// Changes may cause incorrect behavior and will be lost if the code is +// regenerated. +// +using Newtonsoft.Json; +using System.Collections.Generic; +using Microsoft.Bot.Builder.AI.Luis; + +namespace Microsoft.Bot.Builder.TestBot.Shared.CognitiveModels +{ + public class FlightBooking: IRecognizerConvert + { + public string Text; + public string AlteredText; + public enum Intent { + BookFlight, + Cancel, + GetWeather, + None + }; + public Dictionary Intents; + + public class _Entities + { + + // Built-in entities + public DateTimeSpec[] datetime; + + // Lists + public string[][] Airport; + + // Composites + public class _InstanceFrom + { + public InstanceData[] Airport; + } + public class FromClass + { + public string[][] Airport; + [JsonProperty("$instance")] + public _InstanceFrom _instance; + } + public FromClass[] From; + + public class _InstanceTo + { + public InstanceData[] Airport; + } + public class ToClass + { + public string[][] Airport; + [JsonProperty("$instance")] + public _InstanceTo _instance; + } + public ToClass[] To; + + // Instance + public class _Instance + { + public InstanceData[] datetime; + public InstanceData[] Airport; + public InstanceData[] From; + public InstanceData[] To; + } + [JsonProperty("$instance")] + public _Instance _instance; + } + public _Entities Entities; + + [JsonExtensionData(ReadData = true, WriteData = true)] + public IDictionary Properties {get; set; } + + public void Convert(dynamic result) + { + var app = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(result)); + Text = app.Text; + AlteredText = app.AlteredText; + Intents = app.Intents; + Entities = app.Entities; + Properties = app.Properties; + } + + public (Intent intent, double score) TopIntent() + { + Intent maxIntent = Intent.None; + var max = 0.0; + foreach (var entry in Intents) + { + if (entry.Value.Score > max) + { + maxIntent = entry.Key; + max = entry.Value.Score.Value; + } + } + return (maxIntent, max); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/CognitiveModels/FlightBooking.json b/tests/Microsoft.Bot.Builder.TestBot.Shared/CognitiveModels/FlightBooking.json new file mode 100644 index 0000000000..7904f51e2c --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/CognitiveModels/FlightBooking.json @@ -0,0 +1,334 @@ +{ + "luis_schema_version": "3.2.0", + "versionId": "0.1", + "name": "FlightBooking", + "desc": "Luis Model for CoreBot", + "culture": "en-us", + "tokenizerVersion": "1.0.0", + "intents": [ + { + "name": "BookFlight" + }, + { + "name": "Cancel" + }, + { + "name": "GetWeather" + }, + { + "name": "None" + } + ], + "entities": [], + "composites": [ + { + "name": "From", + "children": [ + "Airport" + ], + "roles": [] + }, + { + "name": "To", + "children": [ + "Airport" + ], + "roles": [] + } + ], + "closedLists": [ + { + "name": "Airport", + "subLists": [ + { + "canonicalForm": "Paris", + "list": [ + "paris" + ] + }, + { + "canonicalForm": "London", + "list": [ + "london" + ] + }, + { + "canonicalForm": "Berlin", + "list": [ + "berlin" + ] + }, + { + "canonicalForm": "New York", + "list": [ + "new york" + ] + }, + { + "canonicalForm": "Seattle", + "list": [ + "seattle" + ] + } + ], + "roles": [] + } + ], + "patternAnyEntities": [], + "regex_entities": [], + "prebuiltEntities": [ + { + "name": "datetimeV2", + "roles": [] + } + ], + "model_features": [], + "regex_features": [], + "patterns": [], + "utterances": [ + { + "text": "book a flight", + "intent": "BookFlight", + "entities": [] + }, + { + "text": "book a flight from new york", + "intent": "BookFlight", + "entities": [ + { + "entity": "From", + "startPos": 19, + "endPos": 26 + } + ] + }, + { + "text": "book a flight from seattle", + "intent": "BookFlight", + "entities": [ + { + "entity": "From", + "startPos": 19, + "endPos": 25 + } + ] + }, + { + "text": "book a hotel in new york", + "intent": "None", + "entities": [] + }, + { + "text": "book a restaurant", + "intent": "None", + "entities": [] + }, + { + "text": "book flight from london to paris on feb 14th", + "intent": "BookFlight", + "entities": [ + { + "entity": "From", + "startPos": 17, + "endPos": 22 + }, + { + "entity": "To", + "startPos": 27, + "endPos": 31 + } + ] + }, + { + "text": "book flight to berlin on feb 14th", + "intent": "BookFlight", + "entities": [ + { + "entity": "To", + "startPos": 15, + "endPos": 20 + } + ] + }, + { + "text": "book me a flight from london to paris", + "intent": "BookFlight", + "entities": [ + { + "entity": "From", + "startPos": 22, + "endPos": 27 + }, + { + "entity": "To", + "startPos": 32, + "endPos": 36 + } + ] + }, + { + "text": "bye", + "intent": "Cancel", + "entities": [] + }, + { + "text": "cancel booking", + "intent": "Cancel", + "entities": [] + }, + { + "text": "exit", + "intent": "Cancel", + "entities": [] + }, + { + "text": "find an airport near me", + "intent": "None", + "entities": [] + }, + { + "text": "flight to paris", + "intent": "BookFlight", + "entities": [ + { + "entity": "To", + "startPos": 10, + "endPos": 14 + } + ] + }, + { + "text": "flight to paris from london on feb 14th", + "intent": "BookFlight", + "entities": [ + { + "entity": "To", + "startPos": 10, + "endPos": 14 + }, + { + "entity": "From", + "startPos": 21, + "endPos": 26 + } + ] + }, + { + "text": "fly from berlin to paris on may 5th", + "intent": "BookFlight", + "entities": [ + { + "entity": "From", + "startPos": 9, + "endPos": 14 + }, + { + "entity": "To", + "startPos": 19, + "endPos": 23 + } + ] + }, + { + "text": "go to paris", + "intent": "BookFlight", + "entities": [ + { + "entity": "To", + "startPos": 6, + "endPos": 10 + } + ] + }, + { + "text": "going from paris to berlin", + "intent": "BookFlight", + "entities": [ + { + "entity": "From", + "startPos": 11, + "endPos": 15 + }, + { + "entity": "To", + "startPos": 20, + "endPos": 25 + } + ] + }, + { + "text": "i'd like to rent a car", + "intent": "None", + "entities": [] + }, + { + "text": "ignore", + "intent": "Cancel", + "entities": [] + }, + { + "text": "travel from new york to paris", + "intent": "BookFlight", + "entities": [ + { + "entity": "From", + "startPos": 12, + "endPos": 19 + }, + { + "entity": "To", + "startPos": 24, + "endPos": 28 + } + ] + }, + { + "text": "travel to new york", + "intent": "BookFlight", + "entities": [ + { + "entity": "To", + "startPos": 10, + "endPos": 17 + } + ] + }, + { + "text": "travel to paris", + "intent": "BookFlight", + "entities": [ + { + "entity": "To", + "startPos": 10, + "endPos": 14 + } + ] + }, + { + "text": "what's the forecast for this friday?", + "intent": "GetWeather", + "entities": [] + }, + { + "text": "what's the weather like for tomorrow", + "intent": "GetWeather", + "entities": [] + }, + { + "text": "what's the weather like in new york", + "intent": "GetWeather", + "entities": [] + }, + { + "text": "what's the weather like?", + "intent": "GetWeather", + "entities": [] + }, + { + "text": "winter is coming", + "intent": "None", + "entities": [] + } + ], + "settings": [] +} \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Controllers/BotController.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Controllers/BotController.cs new file mode 100644 index 0000000000..ecdc7379f5 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Controllers/BotController.cs @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Bot.Builder.Integration.AspNet.Core; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Controllers +{ + // This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot + // implementation at runtime. Multiple different IBot implementations running at different endpoints can be + // achieved by specifying a more specific type for the bot constructor argument. + [Route("api")] + [ApiController] + public class BotController : ControllerBase + { + private readonly IBotFrameworkHttpAdapter _adapter; + private IBot _bot; + private readonly Func _service; + + public BotController(IBotFrameworkHttpAdapter adapter, Func service) + { + _adapter = adapter; + _service = service; + } + + [Route("{*botname}")] + [HttpPost] + [HttpGet] + public async Task PostAsync(string botname) + { + // Delegate the processing of the HTTP POST to the adapter. + // The adapter will invoke the bot. + _bot = _service(botname) ?? throw new Exception($"The endpoint '{botname}' is not associated with a bot."); + + await _adapter.ProcessAsync(Request, Response, _bot); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugAdapter.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugAdapter.cs new file mode 100644 index 0000000000..e309b4b9f8 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugAdapter.cs @@ -0,0 +1,8 @@ +using Microsoft.Bot.Builder.Integration.AspNet.Core; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Debugging +{ + public class DebugAdapter : BotFrameworkHttpAdapter + { + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugBot.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugBot.cs new file mode 100644 index 0000000000..3c36c80526 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugBot.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Schema; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Debugging +{ + public class DebugBot : ActivityHandler + { + private InspectionMiddleware _inspectionMiddleware; + + public DebugBot(InspectionMiddleware inspectionMiddleware) + { + _inspectionMiddleware = inspectionMiddleware; + } + + protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) + { + await _inspectionMiddleware.ProcessCommandAsync(turnContext); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugController.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugController.cs new file mode 100644 index 0000000000..305abb9866 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Debugging/DebugController.cs @@ -0,0 +1,25 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Debugging +{ + [Route("api/debug")] + [ApiController] + public class DebugController : ControllerBase + { + private DebugAdapter _adapter; + private DebugBot _bot; + + public DebugController(DebugAdapter adapter, DebugBot bot) + { + _adapter = adapter; + _bot = bot; + } + + [HttpPost] + public async Task PostAsync() + { + await _adapter.ProcessAsync(Request, Response, _bot); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/DialogExtensions.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/DialogExtensions.cs new file mode 100644 index 0000000000..6173c9a690 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/DialogExtensions.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Builder.Dialogs; + +namespace Microsoft.Bot.Builder.TestBot.Shared +{ + public static class DialogExtensions + { + public static async Task Run(this Dialog dialog, ITurnContext turnContext, IStatePropertyAccessor accessor, CancellationToken cancellationToken) + { + var dialogSet = new DialogSet(accessor); + dialogSet.Add(dialog); + + var dialogContext = await dialogSet.CreateContextAsync(turnContext, cancellationToken); + var results = await dialogContext.ContinueDialogAsync(cancellationToken); + if (results.Status == DialogTurnStatus.Empty) + { + await dialogContext.BeginDialogAsync(dialog.Id, null, cancellationToken); + } + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/BookingDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/BookingDialog.cs new file mode 100644 index 0000000000..64ca6f2613 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/BookingDialog.cs @@ -0,0 +1,87 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared.Services; +using Microsoft.Recognizers.Text.DataTypes.TimexExpression; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Dialogs +{ + public class BookingDialog : CancelAndHelpDialog + { + private readonly IFlightBookingService _flightBookingService; + + public BookingDialog(GetBookingDetailsDialog getBookingDetailsDialog, IFlightBookingService flightBookingService) + : base(nameof(BookingDialog)) + { + _flightBookingService = flightBookingService; + AddDialog(getBookingDetailsDialog); + AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt))); + var steps = new WaterfallStep[] + { + GetBookingDetailsActionAsync, + ConfirmActionAsync, + FinalActionAsync, + }; + + AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); + + // The initial child Dialog to run. + InitialDialogId = nameof(WaterfallDialog); + } + + private async Task GetBookingDetailsActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + var bookingDetails = (BookingDetails)stepContext.Options ?? new BookingDetails(); + + return await stepContext.BeginDialogAsync(nameof(GetBookingDetailsDialog), bookingDetails, cancellationToken); + } + + private async Task ConfirmActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + var bookingDetails = (BookingDetails)stepContext.Result; + + // Store the booking details in the waterfall state so we can use it once the user confirms + stepContext.Values["BookingInfo"] = bookingDetails; + + var msg = $"Please confirm, I have you traveling to: {bookingDetails.Destination} from: {bookingDetails.Origin} on: {bookingDetails.TravelDate}"; + return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text(msg) }, cancellationToken); + } + + private async Task FinalActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + string msg; + if ((bool)stepContext.Result) + { + // Pull the booking details from the waterfall state. + var bookingDetails = (BookingDetails)stepContext.Values["BookingInfo"]; + + // Now we have all the booking information to call the booking service. + await stepContext.Context.SendActivityAsync(MessageFactory.Text("Booking your flight, this shouldn't take long..."), cancellationToken); + + var flightBooked = await _flightBookingService.BookFlight(bookingDetails, cancellationToken); + if (flightBooked) + { + // If the call to the booking service was successful tell the user. + var timeProperty = new TimexProperty(bookingDetails.TravelDate); + var travelDateMsg = timeProperty.ToNaturalLanguage(DateTime.Now); + msg = $"I have you booked to {bookingDetails.Destination} from {bookingDetails.Origin} on {travelDateMsg}"; + } + else + { + msg = "Sorry, I was unable to secure your reservation, please try another flight"; + } + } + else + { + msg = "OK, we can do this later"; + } + + await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken); + return await stepContext.EndDialogAsync(null, cancellationToken); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/CancelAndHelpDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/CancelAndHelpDialog.cs new file mode 100644 index 0000000000..1e9ee88261 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/CancelAndHelpDialog.cs @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Schema; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Dialogs +{ + public abstract class CancelAndHelpDialog : ComponentDialog + { + protected CancelAndHelpDialog(string id) + : base(id) + { + } + + protected override async Task OnBeginDialogAsync(DialogContext innerDc, object options, CancellationToken cancellationToken = default(CancellationToken)) + { + var result = await InterruptAsync(innerDc, cancellationToken); + if (result != null) + { + return result; + } + + return await base.OnBeginDialogAsync(innerDc, options, cancellationToken); + } + + protected override async Task OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken = default(CancellationToken)) + { + var result = await InterruptAsync(innerDc, cancellationToken); + if (result != null) + { + return result; + } + + return await base.OnContinueDialogAsync(innerDc, cancellationToken); + } + + private async Task InterruptAsync(DialogContext innerDc, CancellationToken cancellationToken) + { + if (innerDc.Context.Activity.Type == ActivityTypes.Message) + { + var text = innerDc.Context.Activity.Text.ToLowerInvariant(); + + switch (text) + { + case "help": + case "?": + await innerDc.Context.SendActivityAsync("Show Help...", cancellationToken: cancellationToken); + return new DialogTurnResult(DialogTurnStatus.Waiting); + + case "cancel": + case "quit": + await innerDc.Context.SendActivityAsync("Cancelling", cancellationToken: cancellationToken); + return await innerDc.CancelAllDialogsAsync(cancellationToken: cancellationToken); + } + } + + return null; + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/DateResolverDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/DateResolverDialog.cs new file mode 100644 index 0000000000..643f7470d9 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/DateResolverDialog.cs @@ -0,0 +1,89 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Recognizers.Text.DataTypes.TimexExpression; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Dialogs +{ + public class DateResolverDialog : CancelAndHelpDialog + { + public DateResolverDialog(string id = null) + : base(id ?? nameof(DateResolverDialog)) + { + AddDialog(new DateTimePrompt(nameof(DateTimePrompt), DateTimePromptValidator)); + var steps = new WaterfallStep[] + { + InitialActionAsync, + FinalActionAsync, + }; + AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); + + // The initial child Dialog to run. + InitialDialogId = nameof(WaterfallDialog); + } + + private static Task DateTimePromptValidator(PromptValidatorContext> promptContext, CancellationToken cancellationToken) + { + if (promptContext.Recognized.Succeeded) + { + // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part. + // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year. + var timex = promptContext.Recognized.Value[0].Timex.Split('T')[0]; + + // If this is a definite Date including year, month and day we are good otherwise reprompt. + // A better solution might be to let the user know what part is actually missing. + var isDefinite = new TimexProperty(timex).Types.Contains(Constants.TimexTypes.Definite); + + return Task.FromResult(isDefinite); + } + + return Task.FromResult(false); + } + + private async Task InitialActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + var timex = (string)stepContext.Options; + + var promptMsg = "When would you like to travel?"; + var repromptMsg = "I'm sorry, to make your booking please enter a full travel date including Day Month and Year."; + + if (timex == null) + { + // We were not given any date at all so prompt the user. + return await stepContext.PromptAsync( + nameof(DateTimePrompt), + new PromptOptions + { + Prompt = MessageFactory.Text(promptMsg), + RetryPrompt = MessageFactory.Text(repromptMsg), + }, cancellationToken); + } + + // We have a Date we just need to check it is unambiguous. + var timexProperty = new TimexProperty(timex); + if (!timexProperty.Types.Contains(Constants.TimexTypes.Definite)) + { + // This is essentially a "reprompt" of the data we were given up front. + return await stepContext.PromptAsync( + nameof(DateTimePrompt), + new PromptOptions + { + Prompt = MessageFactory.Text(repromptMsg), + }, cancellationToken); + } + + return await stepContext.NextAsync(new List { new DateTimeResolution { Timex = timex } }, cancellationToken); + } + + private async Task FinalActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + var timex = ((List)stepContext.Result)[0].Timex; + return await stepContext.EndDialogAsync(timex, cancellationToken); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/GetBookingDetailsDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/GetBookingDetailsDialog.cs new file mode 100644 index 0000000000..3e01d70d89 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/GetBookingDetailsDialog.cs @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Recognizers.Text.DataTypes.TimexExpression; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Dialogs +{ + public class GetBookingDetailsDialog : CancelAndHelpDialog + { + public GetBookingDetailsDialog() + : base(nameof(GetBookingDetailsDialog)) + { + AddDialog(new TextPrompt(nameof(TextPrompt))); + AddDialog(new DateResolverDialog()); + var steps = new WaterfallStep[] + { + DestinationActionAsync, + OriginActionAsync, + TravelDateActionAsync, + FinalActionAsync, + }; + AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); + + // The initial child Dialog to run. + InitialDialogId = nameof(WaterfallDialog); + } + + private static bool IsAmbiguous(string timex) + { + var timexProperty = new TimexProperty(timex); + return !timexProperty.Types.Contains(Constants.TimexTypes.Definite); + } + + private async Task DestinationActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + var bookingDetails = (BookingDetails)stepContext.Options ?? new BookingDetails(); + + if (bookingDetails.Destination == null) + { + return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Where would you like to travel to?") }, cancellationToken); + } + + return await stepContext.NextAsync(bookingDetails.Destination, cancellationToken); + } + + private async Task OriginActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + var bookingDetails = (BookingDetails)stepContext.Options; + bookingDetails.Destination = (string)stepContext.Result; + + if (bookingDetails.Origin == null) + { + return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Where are you traveling from?") }, cancellationToken); + } + + return await stepContext.NextAsync(bookingDetails.Origin, cancellationToken); + } + + private async Task TravelDateActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + var bookingDetails = (BookingDetails)stepContext.Options; + bookingDetails.Origin = (string)stepContext.Result; + + if (bookingDetails.TravelDate == null || IsAmbiguous(bookingDetails.TravelDate)) + { + // Run the DateResolverDialog giving it whatever details we have from the LUIS call, it will fill out the remainder. + return await stepContext.BeginDialogAsync(nameof(DateResolverDialog), bookingDetails.TravelDate, cancellationToken); + } + + return await stepContext.NextAsync(bookingDetails.TravelDate, cancellationToken); + } + + private async Task FinalActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + var bookingDetails = (BookingDetails)stepContext.Options; + bookingDetails.TravelDate = (string)stepContext.Result; + + // We are done collection booking details, return the data to the caller. + return await stepContext.EndDialogAsync(bookingDetails, cancellationToken); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/MainDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/MainDialog.cs new file mode 100644 index 0000000000..ac633c1a77 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/MainDialog.cs @@ -0,0 +1,129 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared.CognitiveModels; +using Microsoft.Bot.Schema; +using Microsoft.Extensions.Logging; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Dialogs +{ + // A root dialog responsible of understanding user intents and dispatching them sub tasks. + public class MainDialog : ComponentDialog + { + private readonly ILogger _logger; + private readonly IRecognizer _luisRecognizer; + + public MainDialog(ILogger logger, BookingDialog bookingDialog) + : this(logger, null, bookingDialog) + { + } + + public MainDialog(ILogger logger, IRecognizer luisRecognizer, BookingDialog bookingDialog) + : base(nameof(MainDialog)) + { + _logger = logger; + _luisRecognizer = luisRecognizer; + + AddDialog(new TextPrompt(nameof(TextPrompt))); + + // Add bookingDialog intents + AddDialog(bookingDialog); + + // Create and add waterfall for main conversation loop + // NOTE: we use a different task step if LUIS is not configured. + WaterfallStep[] steps; + if (luisRecognizer == null) + { + steps = new WaterfallStep[] + { + PromptForTaskActionAsync, + InvokeTaskActionAsyncNoLuis, + ResumeMainLoopActionAsync, + }; + } + else + { + // LUIS is configured + steps = new WaterfallStep[] + { + PromptForTaskActionAsync, + InvokeTaskActionAsync, + ResumeMainLoopActionAsync, + }; + } + + AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); + + // The initial child Dialog to run. + InitialDialogId = nameof(WaterfallDialog); + } + + private async Task PromptForTaskActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + if (_luisRecognizer == null) + { + var activity = MessageFactory.Text("NOTE: LUIS is not configured. To enable all capabilities, add 'LuisAppId', 'LuisAPIKey' and 'LuisAPIHostName' to the appsettings.json file."); + activity.InputHint = InputHints.IgnoringInput; + await stepContext.Context.SendActivityAsync(activity, cancellationToken); + } + + // Use the text provided in ResumeMainLoopActionAsync or the default if it is the first time. + var promptText = stepContext.Options?.ToString() ?? "What can I help you with today?"; + + return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text(promptText) }, cancellationToken); + } + + private async Task InvokeTaskActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + var luisResult = await _luisRecognizer.RecognizeAsync(stepContext.Context, cancellationToken); + + switch (luisResult.TopIntent().intent) + { + case FlightBooking.Intent.BookFlight: + // Initialize BookingDetails with any entities we may have found in the response. + var bookingDetails = new BookingDetails() + { + // Get destination and origin from the composite entities arrays. + Destination = luisResult.Entities.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault(), + Origin = luisResult.Entities.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault(), + + // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part. + // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year. + TravelDate = luisResult.Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0], + }; + + // Run the BookingDialog giving it whatever details we have from the LUIS call, it will fill out the remainder. + return await stepContext.BeginDialogAsync(nameof(BookingDialog), bookingDetails, cancellationToken); + + case FlightBooking.Intent.GetWeather: + // We haven't implemented the GetWeatherDialog so we just display a TODO message. + await stepContext.Context.SendActivityAsync("TODO: get weather flow here", cancellationToken: cancellationToken); + break; + + default: + // Catch all for unhandled intents + await stepContext.Context.SendActivityAsync($"Sorry, I didn't get that. Please try asking in a different way (intent was {luisResult.TopIntent().intent})", cancellationToken: cancellationToken); + break; + } + + return await stepContext.NextAsync(null, cancellationToken); + } + + private async Task InvokeTaskActionAsyncNoLuis(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + // We only handle book a flight if LUIS is not configured + return await stepContext.BeginDialogAsync(nameof(BookingDialog), new BookingDetails(), cancellationToken); + } + + private async Task ResumeMainLoopActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + // We have completed the task (or the user cancelled), we restart main dialog with a different prompt text. + var promptMessage = "What else can I do for you?"; + return await stepContext.ReplaceDialogAsync(Id, promptMessage, cancellationToken); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/UserProfileDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/UserProfileDialog.cs new file mode 100644 index 0000000000..bff15ae2c9 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Dialogs/UserProfileDialog.cs @@ -0,0 +1,144 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.Dialogs.Choices; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Dialogs +{ + public class UserProfileDialog : ComponentDialog + { + private IStatePropertyAccessor _userProfileAccessor; + + public UserProfileDialog(UserState userState) + : base("root") + { + _userProfileAccessor = userState.CreateProperty("UserProfile"); + + // This array defines how the Waterfall will execute. + var waterfallActions = new WaterfallStep[] + { + TransportActionAsync, + NameActionAsync, + NameConfirmActionAsync, + AgeActionAsync, + ConfirmActionAsync, + SummaryActionAsync, + }; + + // Add named dialogs to the DialogSet. These names are saved in the dialog state. + AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallActions)); + AddDialog(new TextPrompt(nameof(TextPrompt))); + AddDialog(new NumberPrompt(nameof(NumberPrompt), AgePromptValidatorAsync)); + AddDialog(new ChoicePrompt(nameof(ChoicePrompt))); + AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt))); + + // The initial child Dialog to run. + InitialDialogId = nameof(WaterfallDialog); + } + + private static async Task TransportActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + // WaterfallStep always finishes with the end of the Waterfall or with another dialog; here it is a Prompt Dialog. + // Running a prompt here means the next WaterfallStep will be run when the users response is received. + return await stepContext.PromptAsync( + nameof(ChoicePrompt), + new PromptOptions + { + Prompt = MessageFactory.Text("Please enter your mode of transport."), + Choices = ChoiceFactory.ToChoices(new List { "Car", "Bus", "Bicycle" }), + }, cancellationToken); + } + + private static async Task NameActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + stepContext.Values["transport"] = ((FoundChoice)stepContext.Result).Value; + + return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Please enter your name.") }, cancellationToken); + } + + private static Task AgePromptValidatorAsync(PromptValidatorContext promptContext, CancellationToken cancellationToken) + { + // This condition is our validation rule. You can also change the value at this point. + return Task.FromResult(promptContext.Recognized.Value >= 0 && promptContext.Recognized.Value < 150); + } + + private async Task NameConfirmActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + stepContext.Values["name"] = (string)stepContext.Result; + + // We can send messages to the user at any point in the WaterfallStep. + await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Thanks {stepContext.Result}."), cancellationToken); + + // WaterfallStep always finishes with the end of the Waterfall or with another dialog; here it is a Prompt Dialog. + return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text("Would you like to give your age?") }, cancellationToken); + } + + private async Task AgeActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + if ((bool)stepContext.Result) + { + // User said "yes" so we will be prompting for the age. + // WaterfallStep always finishes with the end of the Waterfall or with another dialog, here it is a Prompt Dialog. + var promptOptions = new PromptOptions + { + Prompt = MessageFactory.Text("Please enter your age."), + RetryPrompt = MessageFactory.Text("The value entered must be greater than 0 and less than 150."), + }; + + return await stepContext.PromptAsync(nameof(NumberPrompt), promptOptions, cancellationToken); + } + else + { + // User said "no" so we will skip the next step. Give -1 as the age. + return await stepContext.NextAsync(-1, cancellationToken); + } + } + + private async Task ConfirmActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + stepContext.Values["age"] = (int)stepContext.Result; + + // We can send messages to the user at any point in the WaterfallStep. + // var msg = userProfile.Age == -1 ? "No age given." : $"I have your age as {userProfile.Age}."; + var msg = (int)stepContext.Values["age"] == -1 ? "No age given." : $"I have your age as {stepContext.Values["age"]}."; + + // We can send messages to the user at any point in the WaterfallStep. + await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken); + + // WaterfallStep always finishes with the end of the Waterfall or with another dialog, here it is a Prompt Dialog. + return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text("Is this ok?") }, cancellationToken); + } + + private async Task SummaryActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) + { + if ((bool)stepContext.Result) + { + // Get the current profile object from user state. + var userProfile = await _userProfileAccessor.GetAsync(stepContext.Context, () => new UserProfile(), cancellationToken); + + userProfile.Transport = (string)stepContext.Values["transport"]; + userProfile.Name = (string)stepContext.Values["name"]; + userProfile.Age = (int)stepContext.Values["age"]; + + var msg = $"I have your mode of transport as {userProfile.Transport} and your name as {userProfile.Name}."; + if (userProfile.Age != -1) + { + msg += $" And age as {userProfile.Age}."; + } + + await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken); + } + else + { + await stepContext.Context.SendActivityAsync(MessageFactory.Text("Thanks. Your profile will not be kept."), cancellationToken); + } + + // WaterfallStep always finishes with the end of the Waterfall or with another dialog, here it is the end. + return await stepContext.EndDialogAsync(cancellationToken: cancellationToken); + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/HttpHelper.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/HttpHelper.cs new file mode 100644 index 0000000000..643fdcdd26 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/HttpHelper.cs @@ -0,0 +1,72 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using Microsoft.AspNetCore.Http; +using Microsoft.Bot.Schema; +using Microsoft.Rest.Serialization; +using Newtonsoft.Json; + +namespace Microsoft.Bot.Builder.TestBot.Shared +{ + internal static class HttpHelper + { + public static readonly JsonSerializer BotMessageSerializer = JsonSerializer.Create(new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + Formatting = Formatting.Indented, + DateFormatHandling = DateFormatHandling.IsoDateFormat, + DateTimeZoneHandling = DateTimeZoneHandling.Utc, + ReferenceLoopHandling = ReferenceLoopHandling.Serialize, + ContractResolver = new ReadOnlyJsonContractResolver(), + Converters = new List { new Iso8601TimeSpanConverter() }, + }); + + public static Activity ReadRequest(HttpRequest request) + { + if (request == null) + { + throw new ArgumentNullException(nameof(request)); + } + + var activity = default(Activity); + + using (var bodyReader = new JsonTextReader(new StreamReader(request.Body, Encoding.UTF8))) + { + activity = BotMessageSerializer.Deserialize(bodyReader); + } + + return activity; + } + + public static void WriteResponse(HttpResponse response, InvokeResponse invokeResponse) + { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (invokeResponse == null) + { + response.StatusCode = (int)HttpStatusCode.OK; + } + else + { + response.ContentType = "application/json"; + response.StatusCode = invokeResponse.Status; + + using (var writer = new StreamWriter(response.Body)) + { + using (var jsonWriter = new JsonTextWriter(writer)) + { + BotMessageSerializer.Serialize(jsonWriter, invokeResponse.Body); + } + } + } + } + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Microsoft.Bot.Builder.TestBot.Shared.csproj b/tests/Microsoft.Bot.Builder.TestBot.Shared/Microsoft.Bot.Builder.TestBot.Shared.csproj new file mode 100644 index 0000000000..be7e2f973d --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Microsoft.Bot.Builder.TestBot.Shared.csproj @@ -0,0 +1,25 @@ + + + + netstandard2.0 + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Services/FlightBookingService.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Services/FlightBookingService.cs new file mode 100644 index 0000000000..aca46b7e57 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Services/FlightBookingService.cs @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Services +{ + public class FlightBookingService : IFlightBookingService + { + public Task BookFlight(BookingDetails booking, CancellationToken cancellationToken = default(CancellationToken)) => Task.FromResult(true); + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/Services/IFlightBookingService.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/Services/IFlightBookingService.cs new file mode 100644 index 0000000000..4daa485120 --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/Services/IFlightBookingService.cs @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Bot.Builder.TestBot.Shared.Services +{ + public interface IFlightBookingService + { + Task BookFlight(BookingDetails booking, CancellationToken cancellationToken = default(CancellationToken)); + } +} diff --git a/tests/Microsoft.Bot.Builder.TestBot.Shared/UserProfile.cs b/tests/Microsoft.Bot.Builder.TestBot.Shared/UserProfile.cs new file mode 100644 index 0000000000..89c4aa2e1a --- /dev/null +++ b/tests/Microsoft.Bot.Builder.TestBot.Shared/UserProfile.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Microsoft.Bot.Builder.TestBot.Shared +{ + /// + /// This is our application state. Just a regular serializable .NET class. + /// + public class UserProfile + { + public string Transport { get; set; } + + public string Name { get; set; } + + public int Age { get; set; } + } +} From fb281912c0ff10b6c809a771aabed1e1272dca91 Mon Sep 17 00:00:00 2001 From: Joel Mut Date: Thu, 24 Sep 2020 10:52:20 -0300 Subject: [PATCH 2/3] Move duplicated code into TestBot.Shared project --- .../BookingDetails.cs | 14 - .../Bots/DialogAndWelcomeBot.cs | 68 ---- .../Bots/DialogBot.cs | 54 --- .../Bots/MyBot.cs | 17 - .../Cards/welcomeCard.json | 46 --- .../CognitiveModels/FlightBooking.cs | 101 ------ .../CognitiveModels/FlightBooking.json | 334 ------------------ .../Controllers/BotController.cs | 41 --- .../Debugging/DebugAdapter.cs | 8 - .../Debugging/DebugBot.cs | 24 -- .../Debugging/DebugController.cs | 26 -- .../DialogExtensions.cs | 26 -- .../Dialogs/BookingDialog.cs | 88 ----- .../Dialogs/CancelAndHelpDialog.cs | 63 ---- .../Dialogs/DateResolverDialog.cs | 89 ----- .../Dialogs/GetBookingDetailsDialog.cs | 86 ----- .../Dialogs/MainDialog.cs | 130 ------- .../Dialogs/UserProfileDialog.cs | 145 -------- .../HttpHelper.cs | 72 ---- ...osoft.Bot.Builder.TestBot.NetCore21.csproj | 10 +- .../Services/FlightBookingService.cs | 13 - .../Services/IFlightBookingService.cs | 13 - .../Startup.cs | 5 +- .../UserProfile.cs | 17 - .../BookingDetails.cs | 14 - .../Bots/DialogAndWelcomeBot.cs | 68 ---- .../Bots/DialogBot.cs | 54 --- .../Bots/MyBot.cs | 17 - .../Cards/welcomeCard.json | 46 --- .../CognitiveModels/FlightBooking.cs | 101 ------ .../CognitiveModels/FlightBooking.json | 334 ------------------ .../Controllers/BotController.cs | 41 --- .../Debugging/DebugAdapter.cs | 8 - .../Debugging/DebugBot.cs | 24 -- .../Debugging/DebugController.cs | 26 -- .../DialogExtensions.cs | 26 -- .../Dialogs/BookingDialog.cs | 88 ----- .../Dialogs/CancelAndHelpDialog.cs | 63 ---- .../Dialogs/DateResolverDialog.cs | 89 ----- .../Dialogs/GetBookingDetailsDialog.cs | 86 ----- .../Dialogs/MainDialog.cs | 130 ------- .../Dialogs/UserProfileDialog.cs | 145 -------- .../HttpHelper.cs | 72 ---- .../Microsoft.Bot.Builder.TestBot.csproj | 9 +- .../Services/FlightBookingService.cs | 13 - .../Services/IFlightBookingService.cs | 13 - .../Microsoft.Bot.Builder.TestBot/Startup.cs | 5 +- .../UserProfile.cs | 17 - 48 files changed, 8 insertions(+), 2971 deletions(-) delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/BookingDetails.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/DialogAndWelcomeBot.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/DialogBot.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/MyBot.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Cards/welcomeCard.json delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/CognitiveModels/FlightBooking.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/CognitiveModels/FlightBooking.json delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Controllers/BotController.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugAdapter.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugBot.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugController.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/DialogExtensions.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/BookingDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/CancelAndHelpDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/DateResolverDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/GetBookingDetailsDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/MainDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/UserProfileDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/HttpHelper.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Services/FlightBookingService.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/Services/IFlightBookingService.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21/UserProfile.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/BookingDetails.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Bots/DialogAndWelcomeBot.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Bots/DialogBot.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Bots/MyBot.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Cards/welcomeCard.json delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/CognitiveModels/FlightBooking.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/CognitiveModels/FlightBooking.json delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Controllers/BotController.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugAdapter.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugBot.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugController.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/DialogExtensions.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Dialogs/BookingDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Dialogs/CancelAndHelpDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Dialogs/DateResolverDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Dialogs/GetBookingDetailsDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Dialogs/MainDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Dialogs/UserProfileDialog.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/HttpHelper.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Services/FlightBookingService.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/Services/IFlightBookingService.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot/UserProfile.cs diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/BookingDetails.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/BookingDetails.cs deleted file mode 100644 index c13c1a33db..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/BookingDetails.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Microsoft.BotBuilderSamples -{ - public class BookingDetails - { - public string Destination { get; set; } - - public string Origin { get; set; } - - public string TravelDate { get; set; } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/DialogAndWelcomeBot.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/DialogAndWelcomeBot.cs deleted file mode 100644 index 3ab0c53d9e..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/DialogAndWelcomeBot.cs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; - -namespace Microsoft.BotBuilderSamples -{ - public class DialogAndWelcomeBot : DialogBot - where T : Dialog - { - public DialogAndWelcomeBot(ConversationState conversationState, UserState userState, T dialog, ILogger> logger) - : base(conversationState, userState, dialog, logger) - { - } - - protected override async Task OnMembersAddedAsync(IList membersAdded, ITurnContext turnContext, CancellationToken cancellationToken) - { - foreach (var member in membersAdded) - { - // Greet anyone that was not the target (recipient) of this message. - // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details. - if (member.Id != turnContext.Activity.Recipient.Id) - { - var welcomeCard = CreateAdaptiveCardAttachment(); - var response = CreateResponse(turnContext.Activity, welcomeCard); - await turnContext.SendActivityAsync(response, cancellationToken); - await Dialog.Run(turnContext, ConversationState.CreateProperty("DialogState"), cancellationToken); - } - } - } - - // Load attachment from embedded resource. - private Attachment CreateAdaptiveCardAttachment() - { - var rootNamespace = typeof(Startup).Namespace; - var cardResourcePath = $"{rootNamespace}.Cards.welcomeCard.json"; - - using (var stream = GetType().Assembly.GetManifestResourceStream(cardResourcePath)) - { - using (var reader = new StreamReader(stream)) - { - var adaptiveCard = reader.ReadToEnd(); - return new Attachment() - { - ContentType = "application/vnd.microsoft.card.adaptive", - Content = JsonConvert.DeserializeObject(adaptiveCard), - }; - } - } - } - - // Create an attachment message response. - private Activity CreateResponse(IActivity activity, Attachment attachment) - { - var response = ((Activity)activity).CreateReply(); - response.Attachments = new List() { attachment }; - return response; - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/DialogBot.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/DialogBot.cs deleted file mode 100644 index f0019d3610..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/DialogBot.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotBuilderSamples -{ - // This IBot implementation can run any type of Dialog. The use of type parameterization is to allows multiple different bots - // to be run at different endpoints within the same project. This can be achieved by defining distinct Controller types - // each with dependency on distinct IBot types, this way ASP Dependency Injection can glue everything together without ambiguity. - // The ConversationState is used by the Dialog system. The UserState isn't, however, it might have been used in a Dialog implementation, - // and the requirement is that all BotState objects are saved at the end of a turn. - public class DialogBot : ActivityHandler - where T : Dialog - { - public DialogBot(ConversationState conversationState, UserState userState, T dialog, ILogger> logger) - { - ConversationState = conversationState; - UserState = userState; - Dialog = dialog; - Logger = logger; - } - - protected Dialog Dialog { get; } - - protected BotState ConversationState { get; } - - protected BotState UserState { get; } - - protected ILogger Logger { get; } - - public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)) - { - await base.OnTurnAsync(turnContext, cancellationToken); - - // Save any state changes that might have occurred during the turn. - await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken); - await UserState.SaveChangesAsync(turnContext, false, cancellationToken); - } - - protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - Logger.LogInformation("Running dialog with Message Activity."); - - // Run the Dialog with the new message Activity. - await Dialog.Run(turnContext, ConversationState.CreateProperty("DialogState"), cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/MyBot.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/MyBot.cs deleted file mode 100644 index 0ecfec74db..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Bots/MyBot.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Schema; - -namespace Microsoft.Bot.Builder.TestBot.Bots -{ - public class MyBot : ActivityHandler - { - protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text}"), cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Cards/welcomeCard.json b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Cards/welcomeCard.json deleted file mode 100644 index 659bf965a9..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Cards/welcomeCard.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "body": [ - { - "type": "Image", - "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU", - "size": "stretch" - }, - { - "type": "TextBlock", - "spacing": "medium", - "size": "default", - "weight": "bolder", - "text": "Welcome to Bot Framework!", - "wrap": true, - "maxLines": 0 - }, - { - "type": "TextBlock", - "size": "default", - "isSubtle": "yes", - "text": "Now that you have successfully run your bot, follow the links in this Adaptive Card to expand your knowledge of Bot Framework.", - "wrap": true, - "maxLines": 0 - } - ], - "actions": [ - { - "type": "Action.OpenUrl", - "title": "Get an overview", - "url": "https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0" - }, - { - "type": "Action.OpenUrl", - "title": "Ask a question", - "url": "https://stackoverflow.com/questions/tagged/botframework" - }, - { - "type": "Action.OpenUrl", - "title": "Learn how to deploy", - "url": "https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-deploy-azure?view=azure-bot-service-4.0" - } - ] -} \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/CognitiveModels/FlightBooking.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/CognitiveModels/FlightBooking.cs deleted file mode 100644 index ce1d8b68ea..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/CognitiveModels/FlightBooking.cs +++ /dev/null @@ -1,101 +0,0 @@ -// -// Code generated by LUISGen C:\Projects\Repos\botbuilder-dotnet\tests\Microsoft.Bot.Builder.TestBot\CognitiveModels\FlightBooking.json -cs Microsoft.BotBuilderSamples.CognitiveModels.FlightBooking -o C:\Projects\Repos\botbuilder-dotnet\tests\Microsoft.Bot.Builder.TestBot\CognitiveModels -// Tool github: https://github.com/microsoft/botbuilder-tools -// Changes may cause incorrect behavior and will be lost if the code is -// regenerated. -// -using Newtonsoft.Json; -using System.Collections.Generic; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.AI.Luis; - -namespace Microsoft.BotBuilderSamples.CognitiveModels -{ - public class FlightBooking: IRecognizerConvert - { - public string Text; - public string AlteredText; - public enum Intent { - BookFlight, - Cancel, - GetWeather, - None - }; - public Dictionary Intents; - - public class _Entities - { - - // Built-in entities - public DateTimeSpec[] datetime; - - // Lists - public string[][] Airport; - - // Composites - public class _InstanceFrom - { - public InstanceData[] Airport; - } - public class FromClass - { - public string[][] Airport; - [JsonProperty("$instance")] - public _InstanceFrom _instance; - } - public FromClass[] From; - - public class _InstanceTo - { - public InstanceData[] Airport; - } - public class ToClass - { - public string[][] Airport; - [JsonProperty("$instance")] - public _InstanceTo _instance; - } - public ToClass[] To; - - // Instance - public class _Instance - { - public InstanceData[] datetime; - public InstanceData[] Airport; - public InstanceData[] From; - public InstanceData[] To; - } - [JsonProperty("$instance")] - public _Instance _instance; - } - public _Entities Entities; - - [JsonExtensionData(ReadData = true, WriteData = true)] - public IDictionary Properties {get; set; } - - public void Convert(dynamic result) - { - var app = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(result)); - Text = app.Text; - AlteredText = app.AlteredText; - Intents = app.Intents; - Entities = app.Entities; - Properties = app.Properties; - } - - public (Intent intent, double score) TopIntent() - { - Intent maxIntent = Intent.None; - var max = 0.0; - foreach (var entry in Intents) - { - if (entry.Value.Score > max) - { - maxIntent = entry.Key; - max = entry.Value.Score.Value; - } - } - return (maxIntent, max); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/CognitiveModels/FlightBooking.json b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/CognitiveModels/FlightBooking.json deleted file mode 100644 index 7904f51e2c..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/CognitiveModels/FlightBooking.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "luis_schema_version": "3.2.0", - "versionId": "0.1", - "name": "FlightBooking", - "desc": "Luis Model for CoreBot", - "culture": "en-us", - "tokenizerVersion": "1.0.0", - "intents": [ - { - "name": "BookFlight" - }, - { - "name": "Cancel" - }, - { - "name": "GetWeather" - }, - { - "name": "None" - } - ], - "entities": [], - "composites": [ - { - "name": "From", - "children": [ - "Airport" - ], - "roles": [] - }, - { - "name": "To", - "children": [ - "Airport" - ], - "roles": [] - } - ], - "closedLists": [ - { - "name": "Airport", - "subLists": [ - { - "canonicalForm": "Paris", - "list": [ - "paris" - ] - }, - { - "canonicalForm": "London", - "list": [ - "london" - ] - }, - { - "canonicalForm": "Berlin", - "list": [ - "berlin" - ] - }, - { - "canonicalForm": "New York", - "list": [ - "new york" - ] - }, - { - "canonicalForm": "Seattle", - "list": [ - "seattle" - ] - } - ], - "roles": [] - } - ], - "patternAnyEntities": [], - "regex_entities": [], - "prebuiltEntities": [ - { - "name": "datetimeV2", - "roles": [] - } - ], - "model_features": [], - "regex_features": [], - "patterns": [], - "utterances": [ - { - "text": "book a flight", - "intent": "BookFlight", - "entities": [] - }, - { - "text": "book a flight from new york", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 19, - "endPos": 26 - } - ] - }, - { - "text": "book a flight from seattle", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 19, - "endPos": 25 - } - ] - }, - { - "text": "book a hotel in new york", - "intent": "None", - "entities": [] - }, - { - "text": "book a restaurant", - "intent": "None", - "entities": [] - }, - { - "text": "book flight from london to paris on feb 14th", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 17, - "endPos": 22 - }, - { - "entity": "To", - "startPos": 27, - "endPos": 31 - } - ] - }, - { - "text": "book flight to berlin on feb 14th", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 15, - "endPos": 20 - } - ] - }, - { - "text": "book me a flight from london to paris", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 22, - "endPos": 27 - }, - { - "entity": "To", - "startPos": 32, - "endPos": 36 - } - ] - }, - { - "text": "bye", - "intent": "Cancel", - "entities": [] - }, - { - "text": "cancel booking", - "intent": "Cancel", - "entities": [] - }, - { - "text": "exit", - "intent": "Cancel", - "entities": [] - }, - { - "text": "find an airport near me", - "intent": "None", - "entities": [] - }, - { - "text": "flight to paris", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 10, - "endPos": 14 - } - ] - }, - { - "text": "flight to paris from london on feb 14th", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 10, - "endPos": 14 - }, - { - "entity": "From", - "startPos": 21, - "endPos": 26 - } - ] - }, - { - "text": "fly from berlin to paris on may 5th", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 9, - "endPos": 14 - }, - { - "entity": "To", - "startPos": 19, - "endPos": 23 - } - ] - }, - { - "text": "go to paris", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 6, - "endPos": 10 - } - ] - }, - { - "text": "going from paris to berlin", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 11, - "endPos": 15 - }, - { - "entity": "To", - "startPos": 20, - "endPos": 25 - } - ] - }, - { - "text": "i'd like to rent a car", - "intent": "None", - "entities": [] - }, - { - "text": "ignore", - "intent": "Cancel", - "entities": [] - }, - { - "text": "travel from new york to paris", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 12, - "endPos": 19 - }, - { - "entity": "To", - "startPos": 24, - "endPos": 28 - } - ] - }, - { - "text": "travel to new york", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 10, - "endPos": 17 - } - ] - }, - { - "text": "travel to paris", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 10, - "endPos": 14 - } - ] - }, - { - "text": "what's the forecast for this friday?", - "intent": "GetWeather", - "entities": [] - }, - { - "text": "what's the weather like for tomorrow", - "intent": "GetWeather", - "entities": [] - }, - { - "text": "what's the weather like in new york", - "intent": "GetWeather", - "entities": [] - }, - { - "text": "what's the weather like?", - "intent": "GetWeather", - "entities": [] - }, - { - "text": "winter is coming", - "intent": "None", - "entities": [] - } - ], - "settings": [] -} \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Controllers/BotController.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Controllers/BotController.cs deleted file mode 100644 index 71c97054a5..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Controllers/BotController.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; - -namespace Microsoft.BotBuilderSamples -{ - // This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot - // implementation at runtime. Multiple different IBot implementations running at different endpoints can be - // achieved by specifying a more specific type for the bot constructor argument. - [Route("api")] - [ApiController] - public class BotController : ControllerBase - { - private readonly IBotFrameworkHttpAdapter _adapter; - private IBot _bot; - private readonly Func _service; - - public BotController(IBotFrameworkHttpAdapter adapter, Func service) - { - _adapter = adapter; - _service = service; - } - - [Route("{*botname}")] - [HttpPost] - [HttpGet] - public async Task PostAsync(string botname) - { - // Delegate the processing of the HTTP POST to the adapter. - // The adapter will invoke the bot. - _bot = _service(botname) ?? throw new Exception($"The endpoint '{botname}' is not associated with a bot."); - - await _adapter.ProcessAsync(Request, Response, _bot); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugAdapter.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugAdapter.cs deleted file mode 100644 index df39542ce8..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugAdapter.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.Bot.Builder.Integration.AspNet.Core; - -namespace Microsoft.Bot.Builder.TestBot.Debugging -{ - public class DebugAdapter : BotFrameworkHttpAdapter - { - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugBot.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugBot.cs deleted file mode 100644 index 3eecd558b4..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugBot.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Schema; - -namespace Microsoft.Bot.Builder.TestBot.Debugging -{ - public class DebugBot : ActivityHandler - { - private InspectionMiddleware _inspectionMiddleware; - - public DebugBot(InspectionMiddleware inspectionMiddleware) - { - _inspectionMiddleware = inspectionMiddleware; - } - - protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - await _inspectionMiddleware.ProcessCommandAsync(turnContext); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugController.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugController.cs deleted file mode 100644 index d8951e67f7..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Debugging/DebugController.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder.TestBot.Debugging; - -namespace Microsoft.Bot.Builder.TestBot.Controllers -{ - [Route("api/debug")] - [ApiController] - public class DebugController : ControllerBase - { - private DebugAdapter _adapter; - private DebugBot _bot; - - public DebugController(DebugAdapter adapter, DebugBot bot) - { - _adapter = adapter; - _bot = bot; - } - - [HttpPost] - public async Task PostAsync() - { - await _adapter.ProcessAsync(Request, Response, _bot); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/DialogExtensions.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/DialogExtensions.cs deleted file mode 100644 index f2fd73f1a0..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/DialogExtensions.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; - -namespace Microsoft.BotBuilderSamples -{ - public static class DialogExtensions - { - public static async Task Run(this Dialog dialog, ITurnContext turnContext, IStatePropertyAccessor accessor, CancellationToken cancellationToken) - { - var dialogSet = new DialogSet(accessor); - dialogSet.Add(dialog); - - var dialogContext = await dialogSet.CreateContextAsync(turnContext, cancellationToken); - var results = await dialogContext.ContinueDialogAsync(cancellationToken); - if (results.Status == DialogTurnStatus.Empty) - { - await dialogContext.BeginDialogAsync(dialog.Id, null, cancellationToken); - } - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/BookingDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/BookingDialog.cs deleted file mode 100644 index f10a30466b..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/BookingDialog.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.BotBuilderSamples.Services; -using Microsoft.Recognizers.Text.DataTypes.TimexExpression; - -namespace Microsoft.BotBuilderSamples -{ - public class BookingDialog : CancelAndHelpDialog - { - private readonly IFlightBookingService _flightBookingService; - - public BookingDialog(GetBookingDetailsDialog getBookingDetailsDialog, IFlightBookingService flightBookingService) - : base(nameof(BookingDialog)) - { - _flightBookingService = flightBookingService; - AddDialog(getBookingDetailsDialog); - AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt))); - var steps = new WaterfallStep[] - { - GetBookingDetailsActionAsync, - ConfirmActionAsync, - FinalActionAsync, - }; - - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task GetBookingDetailsActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Options ?? new BookingDetails(); - - return await stepContext.BeginDialogAsync(nameof(GetBookingDetailsDialog), bookingDetails, cancellationToken); - } - - private async Task ConfirmActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Result; - - // Store the booking details in the waterfall state so we can use it once the user confirms - stepContext.Values["BookingInfo"] = bookingDetails; - - var msg = $"Please confirm, I have you traveling to: {bookingDetails.Destination} from: {bookingDetails.Origin} on: {bookingDetails.TravelDate}"; - return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text(msg) }, cancellationToken); - } - - private async Task FinalActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - string msg; - if ((bool)stepContext.Result) - { - // Pull the booking details from the waterfall state. - var bookingDetails = (BookingDetails)stepContext.Values["BookingInfo"]; - - // Now we have all the booking information to call the booking service. - await stepContext.Context.SendActivityAsync(MessageFactory.Text("Booking your flight, this shouldn't take long..."), cancellationToken); - - var flightBooked = await _flightBookingService.BookFlight(bookingDetails, cancellationToken); - if (flightBooked) - { - // If the call to the booking service was successful tell the user. - var timeProperty = new TimexProperty(bookingDetails.TravelDate); - var travelDateMsg = timeProperty.ToNaturalLanguage(DateTime.Now); - msg = $"I have you booked to {bookingDetails.Destination} from {bookingDetails.Origin} on {travelDateMsg}"; - } - else - { - msg = "Sorry, I was unable to secure your reservation, please try another flight"; - } - } - else - { - msg = "OK, we can do this later"; - } - - await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken); - return await stepContext.EndDialogAsync(null, cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/CancelAndHelpDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/CancelAndHelpDialog.cs deleted file mode 100644 index 36939eb403..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/CancelAndHelpDialog.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotBuilderSamples -{ - public abstract class CancelAndHelpDialog : ComponentDialog - { - protected CancelAndHelpDialog(string id) - : base(id) - { - } - - protected override async Task OnBeginDialogAsync(DialogContext innerDc, object options, CancellationToken cancellationToken = default(CancellationToken)) - { - var result = await InterruptAsync(innerDc, cancellationToken); - if (result != null) - { - return result; - } - - return await base.OnBeginDialogAsync(innerDc, options, cancellationToken); - } - - protected override async Task OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken = default(CancellationToken)) - { - var result = await InterruptAsync(innerDc, cancellationToken); - if (result != null) - { - return result; - } - - return await base.OnContinueDialogAsync(innerDc, cancellationToken); - } - - private async Task InterruptAsync(DialogContext innerDc, CancellationToken cancellationToken) - { - if (innerDc.Context.Activity.Type == ActivityTypes.Message) - { - var text = innerDc.Context.Activity.Text.ToLowerInvariant(); - - switch (text) - { - case "help": - case "?": - await innerDc.Context.SendActivityAsync("Show Help...", cancellationToken: cancellationToken); - return new DialogTurnResult(DialogTurnStatus.Waiting); - - case "cancel": - case "quit": - await innerDc.Context.SendActivityAsync("Cancelling", cancellationToken: cancellationToken); - return await innerDc.CancelAllDialogsAsync(cancellationToken: cancellationToken); - } - } - - return null; - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/DateResolverDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/DateResolverDialog.cs deleted file mode 100644 index d3d0a503a3..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/DateResolverDialog.cs +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Recognizers.Text.DataTypes.TimexExpression; - -namespace Microsoft.BotBuilderSamples -{ - public class DateResolverDialog : CancelAndHelpDialog - { - public DateResolverDialog(string id = null) - : base(id ?? nameof(DateResolverDialog)) - { - AddDialog(new DateTimePrompt(nameof(DateTimePrompt), DateTimePromptValidator)); - var steps = new WaterfallStep[] - { - InitialActionAsync, - FinalActionAsync, - }; - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private static Task DateTimePromptValidator(PromptValidatorContext> promptContext, CancellationToken cancellationToken) - { - if (promptContext.Recognized.Succeeded) - { - // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part. - // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year. - var timex = promptContext.Recognized.Value[0].Timex.Split('T')[0]; - - // If this is a definite Date including year, month and day we are good otherwise reprompt. - // A better solution might be to let the user know what part is actually missing. - var isDefinite = new TimexProperty(timex).Types.Contains(Constants.TimexTypes.Definite); - - return Task.FromResult(isDefinite); - } - - return Task.FromResult(false); - } - - private async Task InitialActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var timex = (string)stepContext.Options; - - var promptMsg = "When would you like to travel?"; - var repromptMsg = "I'm sorry, to make your booking please enter a full travel date including Day Month and Year."; - - if (timex == null) - { - // We were not given any date at all so prompt the user. - return await stepContext.PromptAsync( - nameof(DateTimePrompt), - new PromptOptions - { - Prompt = MessageFactory.Text(promptMsg), - RetryPrompt = MessageFactory.Text(repromptMsg), - }, cancellationToken); - } - - // We have a Date we just need to check it is unambiguous. - var timexProperty = new TimexProperty(timex); - if (!timexProperty.Types.Contains(Constants.TimexTypes.Definite)) - { - // This is essentially a "reprompt" of the data we were given up front. - return await stepContext.PromptAsync( - nameof(DateTimePrompt), - new PromptOptions - { - Prompt = MessageFactory.Text(repromptMsg), - }, cancellationToken); - } - - return await stepContext.NextAsync(new List { new DateTimeResolution { Timex = timex } }, cancellationToken); - } - - private async Task FinalActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var timex = ((List)stepContext.Result)[0].Timex; - return await stepContext.EndDialogAsync(timex, cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/GetBookingDetailsDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/GetBookingDetailsDialog.cs deleted file mode 100644 index 891bca7826..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/GetBookingDetailsDialog.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Recognizers.Text.DataTypes.TimexExpression; - -namespace Microsoft.BotBuilderSamples -{ - public class GetBookingDetailsDialog : CancelAndHelpDialog - { - public GetBookingDetailsDialog() - : base(nameof(GetBookingDetailsDialog)) - { - AddDialog(new TextPrompt(nameof(TextPrompt))); - AddDialog(new DateResolverDialog()); - var steps = new WaterfallStep[] - { - DestinationActionAsync, - OriginActionAsync, - TravelDateActionAsync, - FinalActionAsync, - }; - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private static bool IsAmbiguous(string timex) - { - var timexProperty = new TimexProperty(timex); - return !timexProperty.Types.Contains(Constants.TimexTypes.Definite); - } - - private async Task DestinationActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Options ?? new BookingDetails(); - - if (bookingDetails.Destination == null) - { - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Where would you like to travel to?") }, cancellationToken); - } - - return await stepContext.NextAsync(bookingDetails.Destination, cancellationToken); - } - - private async Task OriginActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Options; - bookingDetails.Destination = (string)stepContext.Result; - - if (bookingDetails.Origin == null) - { - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Where are you traveling from?") }, cancellationToken); - } - - return await stepContext.NextAsync(bookingDetails.Origin, cancellationToken); - } - - private async Task TravelDateActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Options; - bookingDetails.Origin = (string)stepContext.Result; - - if (bookingDetails.TravelDate == null || IsAmbiguous(bookingDetails.TravelDate)) - { - // Run the DateResolverDialog giving it whatever details we have from the LUIS call, it will fill out the remainder. - return await stepContext.BeginDialogAsync(nameof(DateResolverDialog), bookingDetails.TravelDate, cancellationToken); - } - - return await stepContext.NextAsync(bookingDetails.TravelDate, cancellationToken); - } - - private async Task FinalActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Options; - bookingDetails.TravelDate = (string)stepContext.Result; - - // We are done collection booking details, return the data to the caller. - return await stepContext.EndDialogAsync(bookingDetails, cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/MainDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/MainDialog.cs deleted file mode 100644 index 42ddfbc08c..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/MainDialog.cs +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.CognitiveModels; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotBuilderSamples -{ - // A root dialog responsible of understanding user intents and dispatching them sub tasks. - public class MainDialog : ComponentDialog - { - private readonly ILogger _logger; - private readonly IRecognizer _luisRecognizer; - - public MainDialog(ILogger logger, BookingDialog bookingDialog) - : this(logger, null, bookingDialog) - { - } - - public MainDialog(ILogger logger, IRecognizer luisRecognizer, BookingDialog bookingDialog) - : base(nameof(MainDialog)) - { - _logger = logger; - _luisRecognizer = luisRecognizer; - - AddDialog(new TextPrompt(nameof(TextPrompt))); - - // Add bookingDialog intents - AddDialog(bookingDialog); - - // Create and add waterfall for main conversation loop - // NOTE: we use a different task step if LUIS is not configured. - WaterfallStep[] steps; - if (luisRecognizer == null) - { - steps = new WaterfallStep[] - { - PromptForTaskActionAsync, - InvokeTaskActionAsyncNoLuis, - ResumeMainLoopActionAsync, - }; - } - else - { - // LUIS is configured - steps = new WaterfallStep[] - { - PromptForTaskActionAsync, - InvokeTaskActionAsync, - ResumeMainLoopActionAsync, - }; - } - - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task PromptForTaskActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - if (_luisRecognizer == null) - { - var activity = MessageFactory.Text("NOTE: LUIS is not configured. To enable all capabilities, add 'LuisAppId', 'LuisAPIKey' and 'LuisAPIHostName' to the appsettings.json file."); - activity.InputHint = InputHints.IgnoringInput; - await stepContext.Context.SendActivityAsync(activity, cancellationToken); - } - - // Use the text provided in ResumeMainLoopActionAsync or the default if it is the first time. - var promptText = stepContext.Options?.ToString() ?? "What can I help you with today?"; - - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text(promptText) }, cancellationToken); - } - - private async Task InvokeTaskActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var luisResult = await _luisRecognizer.RecognizeAsync(stepContext.Context, cancellationToken); - - switch (luisResult.TopIntent().intent) - { - case FlightBooking.Intent.BookFlight: - // Initialize BookingDetails with any entities we may have found in the response. - var bookingDetails = new BookingDetails() - { - // Get destination and origin from the composite entities arrays. - Destination = luisResult.Entities.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault(), - Origin = luisResult.Entities.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault(), - - // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part. - // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year. - TravelDate = luisResult.Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0], - }; - - // Run the BookingDialog giving it whatever details we have from the LUIS call, it will fill out the remainder. - return await stepContext.BeginDialogAsync(nameof(BookingDialog), bookingDetails, cancellationToken); - - case FlightBooking.Intent.GetWeather: - // We haven't implemented the GetWeatherDialog so we just display a TODO message. - await stepContext.Context.SendActivityAsync("TODO: get weather flow here", cancellationToken: cancellationToken); - break; - - default: - // Catch all for unhandled intents - await stepContext.Context.SendActivityAsync($"Sorry, I didn't get that. Please try asking in a different way (intent was {luisResult.TopIntent().intent})", cancellationToken: cancellationToken); - break; - } - - return await stepContext.NextAsync(null, cancellationToken); - } - - private async Task InvokeTaskActionAsyncNoLuis(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // We only handle book a flight if LUIS is not configured - return await stepContext.BeginDialogAsync(nameof(BookingDialog), new BookingDetails(), cancellationToken); - } - - private async Task ResumeMainLoopActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // We have completed the task (or the user cancelled), we restart main dialog with a different prompt text. - var promptMessage = "What else can I do for you?"; - return await stepContext.ReplaceDialogAsync(Id, promptMessage, cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/UserProfileDialog.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/UserProfileDialog.cs deleted file mode 100644 index 7c6a4d9a8f..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Dialogs/UserProfileDialog.cs +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Choices; - -namespace Microsoft.BotBuilderSamples -{ - public class UserProfileDialog : ComponentDialog - { - private IStatePropertyAccessor _userProfileAccessor; - - public UserProfileDialog(UserState userState) - : base("root") - { - _userProfileAccessor = userState.CreateProperty("UserProfile"); - - // This array defines how the Waterfall will execute. - var waterfallActions = new WaterfallStep[] - { - TransportActionAsync, - NameActionAsync, - NameConfirmActionAsync, - AgeActionAsync, - ConfirmActionAsync, - SummaryActionAsync, - }; - - // Add named dialogs to the DialogSet. These names are saved in the dialog state. - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallActions)); - AddDialog(new TextPrompt(nameof(TextPrompt))); - AddDialog(new NumberPrompt(nameof(NumberPrompt), AgePromptValidatorAsync)); - AddDialog(new ChoicePrompt(nameof(ChoicePrompt))); - AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt))); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private static async Task TransportActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // WaterfallStep always finishes with the end of the Waterfall or with another dialog; here it is a Prompt Dialog. - // Running a prompt here means the next WaterfallStep will be run when the users response is received. - return await stepContext.PromptAsync( - nameof(ChoicePrompt), - new PromptOptions - { - Prompt = MessageFactory.Text("Please enter your mode of transport."), - Choices = ChoiceFactory.ToChoices(new List { "Car", "Bus", "Bicycle" }), - }, cancellationToken); - } - - private static async Task NameActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - stepContext.Values["transport"] = ((FoundChoice)stepContext.Result).Value; - - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Please enter your name.") }, cancellationToken); - } - - private static Task AgePromptValidatorAsync(PromptValidatorContext promptContext, CancellationToken cancellationToken) - { - // This condition is our validation rule. You can also change the value at this point. - return Task.FromResult(promptContext.Recognized.Value >= 0 && promptContext.Recognized.Value < 150); - } - - private async Task NameConfirmActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - stepContext.Values["name"] = (string)stepContext.Result; - - // We can send messages to the user at any point in the WaterfallStep. - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Thanks {stepContext.Result}."), cancellationToken); - - // WaterfallStep always finishes with the end of the Waterfall or with another dialog; here it is a Prompt Dialog. - return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text("Would you like to give your age?") }, cancellationToken); - } - - private async Task AgeActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - if ((bool)stepContext.Result) - { - // User said "yes" so we will be prompting for the age. - // WaterfallStep always finishes with the end of the Waterfall or with another dialog, here it is a Prompt Dialog. - var promptOptions = new PromptOptions - { - Prompt = MessageFactory.Text("Please enter your age."), - RetryPrompt = MessageFactory.Text("The value entered must be greater than 0 and less than 150."), - }; - - return await stepContext.PromptAsync(nameof(NumberPrompt), promptOptions, cancellationToken); - } - else - { - // User said "no" so we will skip the next step. Give -1 as the age. - return await stepContext.NextAsync(-1, cancellationToken); - } - } - - private async Task ConfirmActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - stepContext.Values["age"] = (int)stepContext.Result; - - // We can send messages to the user at any point in the WaterfallStep. - // var msg = userProfile.Age == -1 ? "No age given." : $"I have your age as {userProfile.Age}."; - var msg = (int)stepContext.Values["age"] == -1 ? "No age given." : $"I have your age as {stepContext.Values["age"]}."; - - // We can send messages to the user at any point in the WaterfallStep. - await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken); - - // WaterfallStep always finishes with the end of the Waterfall or with another dialog, here it is a Prompt Dialog. - return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text("Is this ok?") }, cancellationToken); - } - - private async Task SummaryActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - if ((bool)stepContext.Result) - { - // Get the current profile object from user state. - var userProfile = await _userProfileAccessor.GetAsync(stepContext.Context, () => new UserProfile(), cancellationToken); - - userProfile.Transport = (string)stepContext.Values["transport"]; - userProfile.Name = (string)stepContext.Values["name"]; - userProfile.Age = (int)stepContext.Values["age"]; - - var msg = $"I have your mode of transport as {userProfile.Transport} and your name as {userProfile.Name}."; - if (userProfile.Age != -1) - { - msg += $" And age as {userProfile.Age}."; - } - - await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken); - } - else - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text("Thanks. Your profile will not be kept."), cancellationToken); - } - - // WaterfallStep always finishes with the end of the Waterfall or with another dialog, here it is the end. - return await stepContext.EndDialogAsync(cancellationToken: cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/HttpHelper.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/HttpHelper.cs deleted file mode 100644 index 1e1d450567..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/HttpHelper.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Net; -using System.Text; -using Microsoft.AspNetCore.Http; -using Microsoft.Bot.Schema; -using Microsoft.Rest.Serialization; -using Newtonsoft.Json; - -namespace Microsoft.Bot.Builder.TestBot -{ - internal static class HttpHelper - { - public static readonly JsonSerializer BotMessageSerializer = JsonSerializer.Create(new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Ignore, - Formatting = Formatting.Indented, - DateFormatHandling = DateFormatHandling.IsoDateFormat, - DateTimeZoneHandling = DateTimeZoneHandling.Utc, - ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - ContractResolver = new ReadOnlyJsonContractResolver(), - Converters = new List { new Iso8601TimeSpanConverter() }, - }); - - public static Activity ReadRequest(HttpRequest request) - { - if (request == null) - { - throw new ArgumentNullException(nameof(request)); - } - - var activity = default(Activity); - - using (var bodyReader = new JsonTextReader(new StreamReader(request.Body, Encoding.UTF8))) - { - activity = BotMessageSerializer.Deserialize(bodyReader); - } - - return activity; - } - - public static void WriteResponse(HttpResponse response, InvokeResponse invokeResponse) - { - if (response == null) - { - throw new ArgumentNullException(nameof(response)); - } - - if (invokeResponse == null) - { - response.StatusCode = (int)HttpStatusCode.OK; - } - else - { - response.ContentType = "application/json"; - response.StatusCode = invokeResponse.Status; - - using (var writer = new StreamWriter(response.Body)) - { - using (var jsonWriter = new JsonTextWriter(writer)) - { - BotMessageSerializer.Serialize(jsonWriter, invokeResponse.Body); - } - } - } - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Microsoft.Bot.Builder.TestBot.NetCore21.csproj b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Microsoft.Bot.Builder.TestBot.NetCore21.csproj index 78aadf0265..0a4b853ce2 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Microsoft.Bot.Builder.TestBot.NetCore21.csproj +++ b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Microsoft.Bot.Builder.TestBot.NetCore21.csproj @@ -6,23 +6,15 @@ Microsoft.BotBuilderSamples - - - - - - - - - + diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Services/FlightBookingService.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Services/FlightBookingService.cs deleted file mode 100644 index 863568086a..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Services/FlightBookingService.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.BotBuilderSamples.Services -{ - public class FlightBookingService : IFlightBookingService - { - public Task BookFlight(BookingDetails booking, CancellationToken cancellationToken = default(CancellationToken)) => Task.FromResult(true); - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Services/IFlightBookingService.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Services/IFlightBookingService.cs deleted file mode 100644 index f73108debc..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Services/IFlightBookingService.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.BotBuilderSamples.Services -{ - public interface IFlightBookingService - { - Task BookFlight(BookingDetails booking, CancellationToken cancellationToken = default(CancellationToken)); - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Startup.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Startup.cs index 3b1adb96a2..03a8aad83b 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Startup.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/Startup.cs @@ -8,9 +8,10 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.AI.Luis; using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.TestBot.Bots; +using Microsoft.Bot.Builder.TestBot.Shared.Bots; +using Microsoft.Bot.Builder.TestBot.Shared.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared.Services; using Microsoft.Bot.Connector.Authentication; -using Microsoft.BotBuilderSamples.Services; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/UserProfile.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21/UserProfile.cs deleted file mode 100644 index 3fc68fa92b..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21/UserProfile.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Microsoft.BotBuilderSamples -{ - /// - /// This is our application state. Just a regular serializable .NET class. - /// - public class UserProfile - { - public string Transport { get; set; } - - public string Name { get; set; } - - public int Age { get; set; } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/BookingDetails.cs b/tests/Microsoft.Bot.Builder.TestBot/BookingDetails.cs deleted file mode 100644 index c13c1a33db..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/BookingDetails.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Microsoft.BotBuilderSamples -{ - public class BookingDetails - { - public string Destination { get; set; } - - public string Origin { get; set; } - - public string TravelDate { get; set; } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Bots/DialogAndWelcomeBot.cs b/tests/Microsoft.Bot.Builder.TestBot/Bots/DialogAndWelcomeBot.cs deleted file mode 100644 index 3ab0c53d9e..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Bots/DialogAndWelcomeBot.cs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; - -namespace Microsoft.BotBuilderSamples -{ - public class DialogAndWelcomeBot : DialogBot - where T : Dialog - { - public DialogAndWelcomeBot(ConversationState conversationState, UserState userState, T dialog, ILogger> logger) - : base(conversationState, userState, dialog, logger) - { - } - - protected override async Task OnMembersAddedAsync(IList membersAdded, ITurnContext turnContext, CancellationToken cancellationToken) - { - foreach (var member in membersAdded) - { - // Greet anyone that was not the target (recipient) of this message. - // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details. - if (member.Id != turnContext.Activity.Recipient.Id) - { - var welcomeCard = CreateAdaptiveCardAttachment(); - var response = CreateResponse(turnContext.Activity, welcomeCard); - await turnContext.SendActivityAsync(response, cancellationToken); - await Dialog.Run(turnContext, ConversationState.CreateProperty("DialogState"), cancellationToken); - } - } - } - - // Load attachment from embedded resource. - private Attachment CreateAdaptiveCardAttachment() - { - var rootNamespace = typeof(Startup).Namespace; - var cardResourcePath = $"{rootNamespace}.Cards.welcomeCard.json"; - - using (var stream = GetType().Assembly.GetManifestResourceStream(cardResourcePath)) - { - using (var reader = new StreamReader(stream)) - { - var adaptiveCard = reader.ReadToEnd(); - return new Attachment() - { - ContentType = "application/vnd.microsoft.card.adaptive", - Content = JsonConvert.DeserializeObject(adaptiveCard), - }; - } - } - } - - // Create an attachment message response. - private Activity CreateResponse(IActivity activity, Attachment attachment) - { - var response = ((Activity)activity).CreateReply(); - response.Attachments = new List() { attachment }; - return response; - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Bots/DialogBot.cs b/tests/Microsoft.Bot.Builder.TestBot/Bots/DialogBot.cs deleted file mode 100644 index f0019d3610..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Bots/DialogBot.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotBuilderSamples -{ - // This IBot implementation can run any type of Dialog. The use of type parameterization is to allows multiple different bots - // to be run at different endpoints within the same project. This can be achieved by defining distinct Controller types - // each with dependency on distinct IBot types, this way ASP Dependency Injection can glue everything together without ambiguity. - // The ConversationState is used by the Dialog system. The UserState isn't, however, it might have been used in a Dialog implementation, - // and the requirement is that all BotState objects are saved at the end of a turn. - public class DialogBot : ActivityHandler - where T : Dialog - { - public DialogBot(ConversationState conversationState, UserState userState, T dialog, ILogger> logger) - { - ConversationState = conversationState; - UserState = userState; - Dialog = dialog; - Logger = logger; - } - - protected Dialog Dialog { get; } - - protected BotState ConversationState { get; } - - protected BotState UserState { get; } - - protected ILogger Logger { get; } - - public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)) - { - await base.OnTurnAsync(turnContext, cancellationToken); - - // Save any state changes that might have occurred during the turn. - await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken); - await UserState.SaveChangesAsync(turnContext, false, cancellationToken); - } - - protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - Logger.LogInformation("Running dialog with Message Activity."); - - // Run the Dialog with the new message Activity. - await Dialog.Run(turnContext, ConversationState.CreateProperty("DialogState"), cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Bots/MyBot.cs b/tests/Microsoft.Bot.Builder.TestBot/Bots/MyBot.cs deleted file mode 100644 index 0ecfec74db..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Bots/MyBot.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Schema; - -namespace Microsoft.Bot.Builder.TestBot.Bots -{ - public class MyBot : ActivityHandler - { - protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text}"), cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Cards/welcomeCard.json b/tests/Microsoft.Bot.Builder.TestBot/Cards/welcomeCard.json deleted file mode 100644 index 659bf965a9..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Cards/welcomeCard.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "body": [ - { - "type": "Image", - "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQtB3AwMUeNoq4gUBGe6Ocj8kyh3bXa9ZbV7u1fVKQoyKFHdkqU", - "size": "stretch" - }, - { - "type": "TextBlock", - "spacing": "medium", - "size": "default", - "weight": "bolder", - "text": "Welcome to Bot Framework!", - "wrap": true, - "maxLines": 0 - }, - { - "type": "TextBlock", - "size": "default", - "isSubtle": "yes", - "text": "Now that you have successfully run your bot, follow the links in this Adaptive Card to expand your knowledge of Bot Framework.", - "wrap": true, - "maxLines": 0 - } - ], - "actions": [ - { - "type": "Action.OpenUrl", - "title": "Get an overview", - "url": "https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0" - }, - { - "type": "Action.OpenUrl", - "title": "Ask a question", - "url": "https://stackoverflow.com/questions/tagged/botframework" - }, - { - "type": "Action.OpenUrl", - "title": "Learn how to deploy", - "url": "https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-deploy-azure?view=azure-bot-service-4.0" - } - ] -} \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot/CognitiveModels/FlightBooking.cs b/tests/Microsoft.Bot.Builder.TestBot/CognitiveModels/FlightBooking.cs deleted file mode 100644 index ce1d8b68ea..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/CognitiveModels/FlightBooking.cs +++ /dev/null @@ -1,101 +0,0 @@ -// -// Code generated by LUISGen C:\Projects\Repos\botbuilder-dotnet\tests\Microsoft.Bot.Builder.TestBot\CognitiveModels\FlightBooking.json -cs Microsoft.BotBuilderSamples.CognitiveModels.FlightBooking -o C:\Projects\Repos\botbuilder-dotnet\tests\Microsoft.Bot.Builder.TestBot\CognitiveModels -// Tool github: https://github.com/microsoft/botbuilder-tools -// Changes may cause incorrect behavior and will be lost if the code is -// regenerated. -// -using Newtonsoft.Json; -using System.Collections.Generic; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.AI.Luis; - -namespace Microsoft.BotBuilderSamples.CognitiveModels -{ - public class FlightBooking: IRecognizerConvert - { - public string Text; - public string AlteredText; - public enum Intent { - BookFlight, - Cancel, - GetWeather, - None - }; - public Dictionary Intents; - - public class _Entities - { - - // Built-in entities - public DateTimeSpec[] datetime; - - // Lists - public string[][] Airport; - - // Composites - public class _InstanceFrom - { - public InstanceData[] Airport; - } - public class FromClass - { - public string[][] Airport; - [JsonProperty("$instance")] - public _InstanceFrom _instance; - } - public FromClass[] From; - - public class _InstanceTo - { - public InstanceData[] Airport; - } - public class ToClass - { - public string[][] Airport; - [JsonProperty("$instance")] - public _InstanceTo _instance; - } - public ToClass[] To; - - // Instance - public class _Instance - { - public InstanceData[] datetime; - public InstanceData[] Airport; - public InstanceData[] From; - public InstanceData[] To; - } - [JsonProperty("$instance")] - public _Instance _instance; - } - public _Entities Entities; - - [JsonExtensionData(ReadData = true, WriteData = true)] - public IDictionary Properties {get; set; } - - public void Convert(dynamic result) - { - var app = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(result)); - Text = app.Text; - AlteredText = app.AlteredText; - Intents = app.Intents; - Entities = app.Entities; - Properties = app.Properties; - } - - public (Intent intent, double score) TopIntent() - { - Intent maxIntent = Intent.None; - var max = 0.0; - foreach (var entry in Intents) - { - if (entry.Value.Score > max) - { - maxIntent = entry.Key; - max = entry.Value.Score.Value; - } - } - return (maxIntent, max); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/CognitiveModels/FlightBooking.json b/tests/Microsoft.Bot.Builder.TestBot/CognitiveModels/FlightBooking.json deleted file mode 100644 index 7904f51e2c..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/CognitiveModels/FlightBooking.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "luis_schema_version": "3.2.0", - "versionId": "0.1", - "name": "FlightBooking", - "desc": "Luis Model for CoreBot", - "culture": "en-us", - "tokenizerVersion": "1.0.0", - "intents": [ - { - "name": "BookFlight" - }, - { - "name": "Cancel" - }, - { - "name": "GetWeather" - }, - { - "name": "None" - } - ], - "entities": [], - "composites": [ - { - "name": "From", - "children": [ - "Airport" - ], - "roles": [] - }, - { - "name": "To", - "children": [ - "Airport" - ], - "roles": [] - } - ], - "closedLists": [ - { - "name": "Airport", - "subLists": [ - { - "canonicalForm": "Paris", - "list": [ - "paris" - ] - }, - { - "canonicalForm": "London", - "list": [ - "london" - ] - }, - { - "canonicalForm": "Berlin", - "list": [ - "berlin" - ] - }, - { - "canonicalForm": "New York", - "list": [ - "new york" - ] - }, - { - "canonicalForm": "Seattle", - "list": [ - "seattle" - ] - } - ], - "roles": [] - } - ], - "patternAnyEntities": [], - "regex_entities": [], - "prebuiltEntities": [ - { - "name": "datetimeV2", - "roles": [] - } - ], - "model_features": [], - "regex_features": [], - "patterns": [], - "utterances": [ - { - "text": "book a flight", - "intent": "BookFlight", - "entities": [] - }, - { - "text": "book a flight from new york", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 19, - "endPos": 26 - } - ] - }, - { - "text": "book a flight from seattle", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 19, - "endPos": 25 - } - ] - }, - { - "text": "book a hotel in new york", - "intent": "None", - "entities": [] - }, - { - "text": "book a restaurant", - "intent": "None", - "entities": [] - }, - { - "text": "book flight from london to paris on feb 14th", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 17, - "endPos": 22 - }, - { - "entity": "To", - "startPos": 27, - "endPos": 31 - } - ] - }, - { - "text": "book flight to berlin on feb 14th", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 15, - "endPos": 20 - } - ] - }, - { - "text": "book me a flight from london to paris", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 22, - "endPos": 27 - }, - { - "entity": "To", - "startPos": 32, - "endPos": 36 - } - ] - }, - { - "text": "bye", - "intent": "Cancel", - "entities": [] - }, - { - "text": "cancel booking", - "intent": "Cancel", - "entities": [] - }, - { - "text": "exit", - "intent": "Cancel", - "entities": [] - }, - { - "text": "find an airport near me", - "intent": "None", - "entities": [] - }, - { - "text": "flight to paris", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 10, - "endPos": 14 - } - ] - }, - { - "text": "flight to paris from london on feb 14th", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 10, - "endPos": 14 - }, - { - "entity": "From", - "startPos": 21, - "endPos": 26 - } - ] - }, - { - "text": "fly from berlin to paris on may 5th", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 9, - "endPos": 14 - }, - { - "entity": "To", - "startPos": 19, - "endPos": 23 - } - ] - }, - { - "text": "go to paris", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 6, - "endPos": 10 - } - ] - }, - { - "text": "going from paris to berlin", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 11, - "endPos": 15 - }, - { - "entity": "To", - "startPos": 20, - "endPos": 25 - } - ] - }, - { - "text": "i'd like to rent a car", - "intent": "None", - "entities": [] - }, - { - "text": "ignore", - "intent": "Cancel", - "entities": [] - }, - { - "text": "travel from new york to paris", - "intent": "BookFlight", - "entities": [ - { - "entity": "From", - "startPos": 12, - "endPos": 19 - }, - { - "entity": "To", - "startPos": 24, - "endPos": 28 - } - ] - }, - { - "text": "travel to new york", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 10, - "endPos": 17 - } - ] - }, - { - "text": "travel to paris", - "intent": "BookFlight", - "entities": [ - { - "entity": "To", - "startPos": 10, - "endPos": 14 - } - ] - }, - { - "text": "what's the forecast for this friday?", - "intent": "GetWeather", - "entities": [] - }, - { - "text": "what's the weather like for tomorrow", - "intent": "GetWeather", - "entities": [] - }, - { - "text": "what's the weather like in new york", - "intent": "GetWeather", - "entities": [] - }, - { - "text": "what's the weather like?", - "intent": "GetWeather", - "entities": [] - }, - { - "text": "winter is coming", - "intent": "None", - "entities": [] - } - ], - "settings": [] -} \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot/Controllers/BotController.cs b/tests/Microsoft.Bot.Builder.TestBot/Controllers/BotController.cs deleted file mode 100644 index 71c97054a5..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Controllers/BotController.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; - -namespace Microsoft.BotBuilderSamples -{ - // This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot - // implementation at runtime. Multiple different IBot implementations running at different endpoints can be - // achieved by specifying a more specific type for the bot constructor argument. - [Route("api")] - [ApiController] - public class BotController : ControllerBase - { - private readonly IBotFrameworkHttpAdapter _adapter; - private IBot _bot; - private readonly Func _service; - - public BotController(IBotFrameworkHttpAdapter adapter, Func service) - { - _adapter = adapter; - _service = service; - } - - [Route("{*botname}")] - [HttpPost] - [HttpGet] - public async Task PostAsync(string botname) - { - // Delegate the processing of the HTTP POST to the adapter. - // The adapter will invoke the bot. - _bot = _service(botname) ?? throw new Exception($"The endpoint '{botname}' is not associated with a bot."); - - await _adapter.ProcessAsync(Request, Response, _bot); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugAdapter.cs b/tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugAdapter.cs deleted file mode 100644 index df39542ce8..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugAdapter.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.Bot.Builder.Integration.AspNet.Core; - -namespace Microsoft.Bot.Builder.TestBot.Debugging -{ - public class DebugAdapter : BotFrameworkHttpAdapter - { - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugBot.cs b/tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugBot.cs deleted file mode 100644 index 3eecd558b4..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugBot.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Schema; - -namespace Microsoft.Bot.Builder.TestBot.Debugging -{ - public class DebugBot : ActivityHandler - { - private InspectionMiddleware _inspectionMiddleware; - - public DebugBot(InspectionMiddleware inspectionMiddleware) - { - _inspectionMiddleware = inspectionMiddleware; - } - - protected override async Task OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancellationToken) - { - await _inspectionMiddleware.ProcessCommandAsync(turnContext); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugController.cs b/tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugController.cs deleted file mode 100644 index d8951e67f7..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Debugging/DebugController.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Builder.TestBot.Debugging; - -namespace Microsoft.Bot.Builder.TestBot.Controllers -{ - [Route("api/debug")] - [ApiController] - public class DebugController : ControllerBase - { - private DebugAdapter _adapter; - private DebugBot _bot; - - public DebugController(DebugAdapter adapter, DebugBot bot) - { - _adapter = adapter; - _bot = bot; - } - - [HttpPost] - public async Task PostAsync() - { - await _adapter.ProcessAsync(Request, Response, _bot); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/DialogExtensions.cs b/tests/Microsoft.Bot.Builder.TestBot/DialogExtensions.cs deleted file mode 100644 index f2fd73f1a0..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/DialogExtensions.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; - -namespace Microsoft.BotBuilderSamples -{ - public static class DialogExtensions - { - public static async Task Run(this Dialog dialog, ITurnContext turnContext, IStatePropertyAccessor accessor, CancellationToken cancellationToken) - { - var dialogSet = new DialogSet(accessor); - dialogSet.Add(dialog); - - var dialogContext = await dialogSet.CreateContextAsync(turnContext, cancellationToken); - var results = await dialogContext.ContinueDialogAsync(cancellationToken); - if (results.Status == DialogTurnStatus.Empty) - { - await dialogContext.BeginDialogAsync(dialog.Id, null, cancellationToken); - } - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/BookingDialog.cs b/tests/Microsoft.Bot.Builder.TestBot/Dialogs/BookingDialog.cs deleted file mode 100644 index f10a30466b..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/BookingDialog.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.BotBuilderSamples.Services; -using Microsoft.Recognizers.Text.DataTypes.TimexExpression; - -namespace Microsoft.BotBuilderSamples -{ - public class BookingDialog : CancelAndHelpDialog - { - private readonly IFlightBookingService _flightBookingService; - - public BookingDialog(GetBookingDetailsDialog getBookingDetailsDialog, IFlightBookingService flightBookingService) - : base(nameof(BookingDialog)) - { - _flightBookingService = flightBookingService; - AddDialog(getBookingDetailsDialog); - AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt))); - var steps = new WaterfallStep[] - { - GetBookingDetailsActionAsync, - ConfirmActionAsync, - FinalActionAsync, - }; - - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task GetBookingDetailsActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Options ?? new BookingDetails(); - - return await stepContext.BeginDialogAsync(nameof(GetBookingDetailsDialog), bookingDetails, cancellationToken); - } - - private async Task ConfirmActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Result; - - // Store the booking details in the waterfall state so we can use it once the user confirms - stepContext.Values["BookingInfo"] = bookingDetails; - - var msg = $"Please confirm, I have you traveling to: {bookingDetails.Destination} from: {bookingDetails.Origin} on: {bookingDetails.TravelDate}"; - return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text(msg) }, cancellationToken); - } - - private async Task FinalActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - string msg; - if ((bool)stepContext.Result) - { - // Pull the booking details from the waterfall state. - var bookingDetails = (BookingDetails)stepContext.Values["BookingInfo"]; - - // Now we have all the booking information to call the booking service. - await stepContext.Context.SendActivityAsync(MessageFactory.Text("Booking your flight, this shouldn't take long..."), cancellationToken); - - var flightBooked = await _flightBookingService.BookFlight(bookingDetails, cancellationToken); - if (flightBooked) - { - // If the call to the booking service was successful tell the user. - var timeProperty = new TimexProperty(bookingDetails.TravelDate); - var travelDateMsg = timeProperty.ToNaturalLanguage(DateTime.Now); - msg = $"I have you booked to {bookingDetails.Destination} from {bookingDetails.Origin} on {travelDateMsg}"; - } - else - { - msg = "Sorry, I was unable to secure your reservation, please try another flight"; - } - } - else - { - msg = "OK, we can do this later"; - } - - await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken); - return await stepContext.EndDialogAsync(null, cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/CancelAndHelpDialog.cs b/tests/Microsoft.Bot.Builder.TestBot/Dialogs/CancelAndHelpDialog.cs deleted file mode 100644 index 36939eb403..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/CancelAndHelpDialog.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; - -namespace Microsoft.BotBuilderSamples -{ - public abstract class CancelAndHelpDialog : ComponentDialog - { - protected CancelAndHelpDialog(string id) - : base(id) - { - } - - protected override async Task OnBeginDialogAsync(DialogContext innerDc, object options, CancellationToken cancellationToken = default(CancellationToken)) - { - var result = await InterruptAsync(innerDc, cancellationToken); - if (result != null) - { - return result; - } - - return await base.OnBeginDialogAsync(innerDc, options, cancellationToken); - } - - protected override async Task OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken = default(CancellationToken)) - { - var result = await InterruptAsync(innerDc, cancellationToken); - if (result != null) - { - return result; - } - - return await base.OnContinueDialogAsync(innerDc, cancellationToken); - } - - private async Task InterruptAsync(DialogContext innerDc, CancellationToken cancellationToken) - { - if (innerDc.Context.Activity.Type == ActivityTypes.Message) - { - var text = innerDc.Context.Activity.Text.ToLowerInvariant(); - - switch (text) - { - case "help": - case "?": - await innerDc.Context.SendActivityAsync("Show Help...", cancellationToken: cancellationToken); - return new DialogTurnResult(DialogTurnStatus.Waiting); - - case "cancel": - case "quit": - await innerDc.Context.SendActivityAsync("Cancelling", cancellationToken: cancellationToken); - return await innerDc.CancelAllDialogsAsync(cancellationToken: cancellationToken); - } - } - - return null; - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/DateResolverDialog.cs b/tests/Microsoft.Bot.Builder.TestBot/Dialogs/DateResolverDialog.cs deleted file mode 100644 index d3d0a503a3..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/DateResolverDialog.cs +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Recognizers.Text.DataTypes.TimexExpression; - -namespace Microsoft.BotBuilderSamples -{ - public class DateResolverDialog : CancelAndHelpDialog - { - public DateResolverDialog(string id = null) - : base(id ?? nameof(DateResolverDialog)) - { - AddDialog(new DateTimePrompt(nameof(DateTimePrompt), DateTimePromptValidator)); - var steps = new WaterfallStep[] - { - InitialActionAsync, - FinalActionAsync, - }; - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private static Task DateTimePromptValidator(PromptValidatorContext> promptContext, CancellationToken cancellationToken) - { - if (promptContext.Recognized.Succeeded) - { - // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part. - // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year. - var timex = promptContext.Recognized.Value[0].Timex.Split('T')[0]; - - // If this is a definite Date including year, month and day we are good otherwise reprompt. - // A better solution might be to let the user know what part is actually missing. - var isDefinite = new TimexProperty(timex).Types.Contains(Constants.TimexTypes.Definite); - - return Task.FromResult(isDefinite); - } - - return Task.FromResult(false); - } - - private async Task InitialActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var timex = (string)stepContext.Options; - - var promptMsg = "When would you like to travel?"; - var repromptMsg = "I'm sorry, to make your booking please enter a full travel date including Day Month and Year."; - - if (timex == null) - { - // We were not given any date at all so prompt the user. - return await stepContext.PromptAsync( - nameof(DateTimePrompt), - new PromptOptions - { - Prompt = MessageFactory.Text(promptMsg), - RetryPrompt = MessageFactory.Text(repromptMsg), - }, cancellationToken); - } - - // We have a Date we just need to check it is unambiguous. - var timexProperty = new TimexProperty(timex); - if (!timexProperty.Types.Contains(Constants.TimexTypes.Definite)) - { - // This is essentially a "reprompt" of the data we were given up front. - return await stepContext.PromptAsync( - nameof(DateTimePrompt), - new PromptOptions - { - Prompt = MessageFactory.Text(repromptMsg), - }, cancellationToken); - } - - return await stepContext.NextAsync(new List { new DateTimeResolution { Timex = timex } }, cancellationToken); - } - - private async Task FinalActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var timex = ((List)stepContext.Result)[0].Timex; - return await stepContext.EndDialogAsync(timex, cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/GetBookingDetailsDialog.cs b/tests/Microsoft.Bot.Builder.TestBot/Dialogs/GetBookingDetailsDialog.cs deleted file mode 100644 index 891bca7826..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/GetBookingDetailsDialog.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Recognizers.Text.DataTypes.TimexExpression; - -namespace Microsoft.BotBuilderSamples -{ - public class GetBookingDetailsDialog : CancelAndHelpDialog - { - public GetBookingDetailsDialog() - : base(nameof(GetBookingDetailsDialog)) - { - AddDialog(new TextPrompt(nameof(TextPrompt))); - AddDialog(new DateResolverDialog()); - var steps = new WaterfallStep[] - { - DestinationActionAsync, - OriginActionAsync, - TravelDateActionAsync, - FinalActionAsync, - }; - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private static bool IsAmbiguous(string timex) - { - var timexProperty = new TimexProperty(timex); - return !timexProperty.Types.Contains(Constants.TimexTypes.Definite); - } - - private async Task DestinationActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Options ?? new BookingDetails(); - - if (bookingDetails.Destination == null) - { - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Where would you like to travel to?") }, cancellationToken); - } - - return await stepContext.NextAsync(bookingDetails.Destination, cancellationToken); - } - - private async Task OriginActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Options; - bookingDetails.Destination = (string)stepContext.Result; - - if (bookingDetails.Origin == null) - { - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Where are you traveling from?") }, cancellationToken); - } - - return await stepContext.NextAsync(bookingDetails.Origin, cancellationToken); - } - - private async Task TravelDateActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Options; - bookingDetails.Origin = (string)stepContext.Result; - - if (bookingDetails.TravelDate == null || IsAmbiguous(bookingDetails.TravelDate)) - { - // Run the DateResolverDialog giving it whatever details we have from the LUIS call, it will fill out the remainder. - return await stepContext.BeginDialogAsync(nameof(DateResolverDialog), bookingDetails.TravelDate, cancellationToken); - } - - return await stepContext.NextAsync(bookingDetails.TravelDate, cancellationToken); - } - - private async Task FinalActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var bookingDetails = (BookingDetails)stepContext.Options; - bookingDetails.TravelDate = (string)stepContext.Result; - - // We are done collection booking details, return the data to the caller. - return await stepContext.EndDialogAsync(bookingDetails, cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/MainDialog.cs b/tests/Microsoft.Bot.Builder.TestBot/Dialogs/MainDialog.cs deleted file mode 100644 index 42ddfbc08c..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/MainDialog.cs +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.CognitiveModels; -using Microsoft.Extensions.Logging; - -namespace Microsoft.BotBuilderSamples -{ - // A root dialog responsible of understanding user intents and dispatching them sub tasks. - public class MainDialog : ComponentDialog - { - private readonly ILogger _logger; - private readonly IRecognizer _luisRecognizer; - - public MainDialog(ILogger logger, BookingDialog bookingDialog) - : this(logger, null, bookingDialog) - { - } - - public MainDialog(ILogger logger, IRecognizer luisRecognizer, BookingDialog bookingDialog) - : base(nameof(MainDialog)) - { - _logger = logger; - _luisRecognizer = luisRecognizer; - - AddDialog(new TextPrompt(nameof(TextPrompt))); - - // Add bookingDialog intents - AddDialog(bookingDialog); - - // Create and add waterfall for main conversation loop - // NOTE: we use a different task step if LUIS is not configured. - WaterfallStep[] steps; - if (luisRecognizer == null) - { - steps = new WaterfallStep[] - { - PromptForTaskActionAsync, - InvokeTaskActionAsyncNoLuis, - ResumeMainLoopActionAsync, - }; - } - else - { - // LUIS is configured - steps = new WaterfallStep[] - { - PromptForTaskActionAsync, - InvokeTaskActionAsync, - ResumeMainLoopActionAsync, - }; - } - - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), steps)); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private async Task PromptForTaskActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - if (_luisRecognizer == null) - { - var activity = MessageFactory.Text("NOTE: LUIS is not configured. To enable all capabilities, add 'LuisAppId', 'LuisAPIKey' and 'LuisAPIHostName' to the appsettings.json file."); - activity.InputHint = InputHints.IgnoringInput; - await stepContext.Context.SendActivityAsync(activity, cancellationToken); - } - - // Use the text provided in ResumeMainLoopActionAsync or the default if it is the first time. - var promptText = stepContext.Options?.ToString() ?? "What can I help you with today?"; - - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text(promptText) }, cancellationToken); - } - - private async Task InvokeTaskActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - var luisResult = await _luisRecognizer.RecognizeAsync(stepContext.Context, cancellationToken); - - switch (luisResult.TopIntent().intent) - { - case FlightBooking.Intent.BookFlight: - // Initialize BookingDetails with any entities we may have found in the response. - var bookingDetails = new BookingDetails() - { - // Get destination and origin from the composite entities arrays. - Destination = luisResult.Entities.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault(), - Origin = luisResult.Entities.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault(), - - // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part. - // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year. - TravelDate = luisResult.Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0], - }; - - // Run the BookingDialog giving it whatever details we have from the LUIS call, it will fill out the remainder. - return await stepContext.BeginDialogAsync(nameof(BookingDialog), bookingDetails, cancellationToken); - - case FlightBooking.Intent.GetWeather: - // We haven't implemented the GetWeatherDialog so we just display a TODO message. - await stepContext.Context.SendActivityAsync("TODO: get weather flow here", cancellationToken: cancellationToken); - break; - - default: - // Catch all for unhandled intents - await stepContext.Context.SendActivityAsync($"Sorry, I didn't get that. Please try asking in a different way (intent was {luisResult.TopIntent().intent})", cancellationToken: cancellationToken); - break; - } - - return await stepContext.NextAsync(null, cancellationToken); - } - - private async Task InvokeTaskActionAsyncNoLuis(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // We only handle book a flight if LUIS is not configured - return await stepContext.BeginDialogAsync(nameof(BookingDialog), new BookingDetails(), cancellationToken); - } - - private async Task ResumeMainLoopActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // We have completed the task (or the user cancelled), we restart main dialog with a different prompt text. - var promptMessage = "What else can I do for you?"; - return await stepContext.ReplaceDialogAsync(Id, promptMessage, cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/UserProfileDialog.cs b/tests/Microsoft.Bot.Builder.TestBot/Dialogs/UserProfileDialog.cs deleted file mode 100644 index 7c6a4d9a8f..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Dialogs/UserProfileDialog.cs +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Choices; - -namespace Microsoft.BotBuilderSamples -{ - public class UserProfileDialog : ComponentDialog - { - private IStatePropertyAccessor _userProfileAccessor; - - public UserProfileDialog(UserState userState) - : base("root") - { - _userProfileAccessor = userState.CreateProperty("UserProfile"); - - // This array defines how the Waterfall will execute. - var waterfallActions = new WaterfallStep[] - { - TransportActionAsync, - NameActionAsync, - NameConfirmActionAsync, - AgeActionAsync, - ConfirmActionAsync, - SummaryActionAsync, - }; - - // Add named dialogs to the DialogSet. These names are saved in the dialog state. - AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallActions)); - AddDialog(new TextPrompt(nameof(TextPrompt))); - AddDialog(new NumberPrompt(nameof(NumberPrompt), AgePromptValidatorAsync)); - AddDialog(new ChoicePrompt(nameof(ChoicePrompt))); - AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt))); - - // The initial child Dialog to run. - InitialDialogId = nameof(WaterfallDialog); - } - - private static async Task TransportActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - // WaterfallStep always finishes with the end of the Waterfall or with another dialog; here it is a Prompt Dialog. - // Running a prompt here means the next WaterfallStep will be run when the users response is received. - return await stepContext.PromptAsync( - nameof(ChoicePrompt), - new PromptOptions - { - Prompt = MessageFactory.Text("Please enter your mode of transport."), - Choices = ChoiceFactory.ToChoices(new List { "Car", "Bus", "Bicycle" }), - }, cancellationToken); - } - - private static async Task NameActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - stepContext.Values["transport"] = ((FoundChoice)stepContext.Result).Value; - - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Please enter your name.") }, cancellationToken); - } - - private static Task AgePromptValidatorAsync(PromptValidatorContext promptContext, CancellationToken cancellationToken) - { - // This condition is our validation rule. You can also change the value at this point. - return Task.FromResult(promptContext.Recognized.Value >= 0 && promptContext.Recognized.Value < 150); - } - - private async Task NameConfirmActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - stepContext.Values["name"] = (string)stepContext.Result; - - // We can send messages to the user at any point in the WaterfallStep. - await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Thanks {stepContext.Result}."), cancellationToken); - - // WaterfallStep always finishes with the end of the Waterfall or with another dialog; here it is a Prompt Dialog. - return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text("Would you like to give your age?") }, cancellationToken); - } - - private async Task AgeActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - if ((bool)stepContext.Result) - { - // User said "yes" so we will be prompting for the age. - // WaterfallStep always finishes with the end of the Waterfall or with another dialog, here it is a Prompt Dialog. - var promptOptions = new PromptOptions - { - Prompt = MessageFactory.Text("Please enter your age."), - RetryPrompt = MessageFactory.Text("The value entered must be greater than 0 and less than 150."), - }; - - return await stepContext.PromptAsync(nameof(NumberPrompt), promptOptions, cancellationToken); - } - else - { - // User said "no" so we will skip the next step. Give -1 as the age. - return await stepContext.NextAsync(-1, cancellationToken); - } - } - - private async Task ConfirmActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - stepContext.Values["age"] = (int)stepContext.Result; - - // We can send messages to the user at any point in the WaterfallStep. - // var msg = userProfile.Age == -1 ? "No age given." : $"I have your age as {userProfile.Age}."; - var msg = (int)stepContext.Values["age"] == -1 ? "No age given." : $"I have your age as {stepContext.Values["age"]}."; - - // We can send messages to the user at any point in the WaterfallStep. - await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken); - - // WaterfallStep always finishes with the end of the Waterfall or with another dialog, here it is a Prompt Dialog. - return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text("Is this ok?") }, cancellationToken); - } - - private async Task SummaryActionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - if ((bool)stepContext.Result) - { - // Get the current profile object from user state. - var userProfile = await _userProfileAccessor.GetAsync(stepContext.Context, () => new UserProfile(), cancellationToken); - - userProfile.Transport = (string)stepContext.Values["transport"]; - userProfile.Name = (string)stepContext.Values["name"]; - userProfile.Age = (int)stepContext.Values["age"]; - - var msg = $"I have your mode of transport as {userProfile.Transport} and your name as {userProfile.Name}."; - if (userProfile.Age != -1) - { - msg += $" And age as {userProfile.Age}."; - } - - await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken); - } - else - { - await stepContext.Context.SendActivityAsync(MessageFactory.Text("Thanks. Your profile will not be kept."), cancellationToken); - } - - // WaterfallStep always finishes with the end of the Waterfall or with another dialog, here it is the end. - return await stepContext.EndDialogAsync(cancellationToken: cancellationToken); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/HttpHelper.cs b/tests/Microsoft.Bot.Builder.TestBot/HttpHelper.cs deleted file mode 100644 index 1e1d450567..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/HttpHelper.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Net; -using System.Text; -using Microsoft.AspNetCore.Http; -using Microsoft.Bot.Schema; -using Microsoft.Rest.Serialization; -using Newtonsoft.Json; - -namespace Microsoft.Bot.Builder.TestBot -{ - internal static class HttpHelper - { - public static readonly JsonSerializer BotMessageSerializer = JsonSerializer.Create(new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Ignore, - Formatting = Formatting.Indented, - DateFormatHandling = DateFormatHandling.IsoDateFormat, - DateTimeZoneHandling = DateTimeZoneHandling.Utc, - ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - ContractResolver = new ReadOnlyJsonContractResolver(), - Converters = new List { new Iso8601TimeSpanConverter() }, - }); - - public static Activity ReadRequest(HttpRequest request) - { - if (request == null) - { - throw new ArgumentNullException(nameof(request)); - } - - var activity = default(Activity); - - using (var bodyReader = new JsonTextReader(new StreamReader(request.Body, Encoding.UTF8))) - { - activity = BotMessageSerializer.Deserialize(bodyReader); - } - - return activity; - } - - public static void WriteResponse(HttpResponse response, InvokeResponse invokeResponse) - { - if (response == null) - { - throw new ArgumentNullException(nameof(response)); - } - - if (invokeResponse == null) - { - response.StatusCode = (int)HttpStatusCode.OK; - } - else - { - response.ContentType = "application/json"; - response.StatusCode = invokeResponse.Status; - - using (var writer = new StreamWriter(response.Body)) - { - using (var jsonWriter = new JsonTextWriter(writer)) - { - BotMessageSerializer.Serialize(jsonWriter, invokeResponse.Body); - } - } - } - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Microsoft.Bot.Builder.TestBot.csproj b/tests/Microsoft.Bot.Builder.TestBot/Microsoft.Bot.Builder.TestBot.csproj index ba82596894..c08c1976a6 100644 --- a/tests/Microsoft.Bot.Builder.TestBot/Microsoft.Bot.Builder.TestBot.csproj +++ b/tests/Microsoft.Bot.Builder.TestBot/Microsoft.Bot.Builder.TestBot.csproj @@ -6,14 +6,6 @@ Microsoft.BotBuilderSamples - - - - - - - - @@ -23,6 +15,7 @@ + diff --git a/tests/Microsoft.Bot.Builder.TestBot/Services/FlightBookingService.cs b/tests/Microsoft.Bot.Builder.TestBot/Services/FlightBookingService.cs deleted file mode 100644 index 863568086a..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Services/FlightBookingService.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.BotBuilderSamples.Services -{ - public class FlightBookingService : IFlightBookingService - { - public Task BookFlight(BookingDetails booking, CancellationToken cancellationToken = default(CancellationToken)) => Task.FromResult(true); - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Services/IFlightBookingService.cs b/tests/Microsoft.Bot.Builder.TestBot/Services/IFlightBookingService.cs deleted file mode 100644 index f73108debc..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/Services/IFlightBookingService.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.BotBuilderSamples.Services -{ - public interface IFlightBookingService - { - Task BookFlight(BookingDetails booking, CancellationToken cancellationToken = default(CancellationToken)); - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot/Startup.cs b/tests/Microsoft.Bot.Builder.TestBot/Startup.cs index 6c047bbe03..5bf30a184b 100644 --- a/tests/Microsoft.Bot.Builder.TestBot/Startup.cs +++ b/tests/Microsoft.Bot.Builder.TestBot/Startup.cs @@ -7,9 +7,10 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.AI.Luis; using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Microsoft.Bot.Builder.TestBot.Bots; +using Microsoft.Bot.Builder.TestBot.Shared.Bots; +using Microsoft.Bot.Builder.TestBot.Shared.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared.Services; using Microsoft.Bot.Connector.Authentication; -using Microsoft.BotBuilderSamples.Services; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; diff --git a/tests/Microsoft.Bot.Builder.TestBot/UserProfile.cs b/tests/Microsoft.Bot.Builder.TestBot/UserProfile.cs deleted file mode 100644 index 3fc68fa92b..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot/UserProfile.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Microsoft.BotBuilderSamples -{ - /// - /// This is our application state. Just a regular serializable .NET class. - /// - public class UserProfile - { - public string Transport { get; set; } - - public string Name { get; set; } - - public int Age { get; set; } - } -} From 292225c9e5f0e4c2ac28986bbd84b1a840d84a2a Mon Sep 17 00:00:00 2001 From: Joel Mut Date: Thu, 24 Sep 2020 10:52:52 -0300 Subject: [PATCH 3/3] Combine TestBot.Tests and TestBot.NetCore21.Tests --- Microsoft.Bot.Builder.sln | 11 - .../Bots/DialogAndWelcomeBotTests.cs | 48 - .../Bots/DialogBotTests.cs | 100 - .../Controllers/BotControllerTests.cs | 56 - .../Dialogs/BookingDialogTests.cs | 63 - .../Dialogs/CancelAndHelpDialogTests.cs | 92 - .../Dialogs/DateResolverDialogTests.cs | 45 - .../Dialogs/GetBookingDetailsDialogTests.cs | 51 - .../Dialogs/MainDialogTestFlowTests.cs | 89 - .../Dialogs/MainDialogTests.cs | 108 - .../Dialogs/TestData/BookingDialogTestCase.cs | 26 - .../BookingDialogTestsDataGenerator.cs | 95 - .../TestData/DateResolverDialogTestCase.cs | 20 - .../DateResolverDialogTestsDataGenerator.cs | 91 - .../GetBookingDetailsDialogTestCase.cs | 20 - ...tBookingDetailsDialogTestsDataGenerator.cs | 142 - .../Dialogs/TestData/README.md | 2 - .../Framework/BotTestBase.cs | 90 - .../Framework/README.md | 2 - .../Framework/SimpleMockFactory.cs | 75 - ...Bot.Builder.TestBot.NetCore21.Tests.csproj | 45 - .../appsettings.json | 9 - .../stylecop.json | 10 - .../xunit.runner.json | 4 - .../Bots/DialogAndWelcomeBotTests.cs | 1 + .../Bots/DialogBotTests.cs | 1 + .../Controllers/BotControllerTests.cs | 1 + .../Dialogs/BookingDialogTests.cs | 4 +- .../Dialogs/CancelAndHelpDialogTests.cs | 1 + .../Dialogs/DateResolverDialogTests.cs | 1 + .../Dialogs/GetBookingDetailsDialogTests.cs | 2 + .../Dialogs/MainDialogTestFlowTests.cs | 4 +- .../Dialogs/MainDialogTests.cs | 6 +- .../Dialogs/TestData/BookingDialogTestCase.cs | 1 + .../BookingDialogTestsDataGenerator.cs | 1 + .../GetBookingDetailsDialogTestCase.cs | 2 + ...tBookingDetailsDialogTestsDataGenerator.cs | 1 + ...Microsoft.Bot.Builder.TestBot.Tests.csproj | 17 +- tests/tests.schema | 12338 ---------------- 39 files changed, 36 insertions(+), 13639 deletions(-) delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Bots/DialogAndWelcomeBotTests.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Bots/DialogBotTests.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Controllers/BotControllerTests.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/BookingDialogTests.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/CancelAndHelpDialogTests.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/DateResolverDialogTests.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/GetBookingDetailsDialogTests.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/MainDialogTestFlowTests.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/MainDialogTests.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/BookingDialogTestCase.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/BookingDialogTestsDataGenerator.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/DateResolverDialogTestCase.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/DateResolverDialogTestsDataGenerator.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/GetBookingDetailsDialogTestCase.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/GetBookingDetailsDialogTestsDataGenerator.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/README.md delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/BotTestBase.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/README.md delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/SimpleMockFactory.cs delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests.csproj delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/appsettings.json delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/stylecop.json delete mode 100644 tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/xunit.runner.json delete mode 100644 tests/tests.schema diff --git a/Microsoft.Bot.Builder.sln b/Microsoft.Bot.Builder.sln index 0afe4480d5..e440ba06e0 100644 --- a/Microsoft.Bot.Builder.sln +++ b/Microsoft.Bot.Builder.sln @@ -177,8 +177,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Adapt EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot.NetCore21", "tests\Microsoft.Bot.Builder.TestBot.NetCore21\Microsoft.Bot.Builder.TestBot.NetCore21.csproj", "{99C466C3-1931-4C0E-AA0A-A8D9D140F56E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.TestBot.NetCore21.Tests", "tests\Microsoft.Bot.Builder.TestBot.NetCore21.Tests\Microsoft.Bot.Builder.TestBot.NetCore21.Tests.csproj", "{2FBA2BB7-73C8-45CD-99B7-D65F817C9051}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Builder.Dialogs.Adaptive.Testing", "libraries\Microsoft.Bot.Builder.Dialogs.Adaptive.Testing\Microsoft.Bot.Builder.Dialogs.Adaptive.Testing.csproj", "{D921D320-0450-455F-8DF2-70EDAC5CCE68}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Skills", "Skills", "{54DA838C-8BB8-4038-8BDB-D887C02B2D9A}" @@ -742,14 +740,6 @@ Global {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release|Any CPU.Build.0 = Release|Any CPU {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU {99C466C3-1931-4C0E-AA0A-A8D9D140F56E}.Release-Windows|Any CPU.Build.0 = Release|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Debug-Windows|Any CPU.Build.0 = Debug|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release|Any CPU.Build.0 = Release|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release-Windows|Any CPU.ActiveCfg = Release|Any CPU - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051}.Release-Windows|Any CPU.Build.0 = Release|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug|Any CPU.Build.0 = Debug|Any CPU {D921D320-0450-455F-8DF2-70EDAC5CCE68}.Debug-Windows|Any CPU.ActiveCfg = Debug|Any CPU @@ -930,7 +920,6 @@ Global {D9242899-AB3F-46BB-BAB4-386CB8EC535C} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} {F98A9787-B175-450F-99FC-EC241EB9D581} = {E8CD434A-306F-41D9-B67D-BFFF3287354D} {99C466C3-1931-4C0E-AA0A-A8D9D140F56E} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} - {2FBA2BB7-73C8-45CD-99B7-D65F817C9051} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} {D921D320-0450-455F-8DF2-70EDAC5CCE68} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A} {54DA838C-8BB8-4038-8BDB-D887C02B2D9A} = {AD743B78-D61F-4FBF-B620-FA83CE599A50} {7F8ED2E7-A4BE-4855-BAF2-95657220E419} = {AA545986-D3E6-406D-8BD5-305B809FB399} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Bots/DialogAndWelcomeBotTests.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Bots/DialogAndWelcomeBotTests.cs deleted file mode 100644 index aab044afe1..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Bots/DialogAndWelcomeBotTests.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Adapters; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.Tests.Framework; -using Xunit; - -namespace Microsoft.BotBuilderSamples.Tests.Bots -{ - public class DialogAndWelcomeBotTests - { - [Fact] - public async Task ReturnsWelcomeCardOnConversationUpdate() - { - // Arrange - var mockRootDialog = SimpleMockFactory.CreateMockDialog(null, "mockRootDialog"); - - // TODO: do we need state here? - var memoryStorage = new MemoryStorage(); - var sut = new DialogAndWelcomeBot(new ConversationState(memoryStorage), new UserState(memoryStorage), mockRootDialog.Object, null); - var conversationUpdateActivity = new Activity - { - Type = ActivityTypes.ConversationUpdate, - MembersAdded = new List - { - new ChannelAccount { Id = "theUser" }, - }, - Recipient = new ChannelAccount { Id = "theBot" }, - }; - var testAdapter = new TestAdapter(Channels.Test); - - // Act - // Note: it is kind of obscure that we need to use OnTurnAsync to trigger OnMembersAdded so we get the card - await testAdapter.ProcessActivityAsync(conversationUpdateActivity, sut.OnTurnAsync, CancellationToken.None); - var reply = testAdapter.GetNextReply(); - - // Assert - var m = (IMessageActivity)reply; - Assert.Equal(1, m.Attachments.Count); - Assert.Equal("application/vnd.microsoft.card.adaptive", m.Attachments.FirstOrDefault()?.ContentType); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Bots/DialogBotTests.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Bots/DialogBotTests.cs deleted file mode 100644 index 4ae8ed697c..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Bots/DialogBotTests.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Adapters; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.BotBuilderSamples.Tests.Framework; -using Microsoft.Extensions.Logging; -using Moq; -using Xunit; - -namespace Microsoft.BotBuilderSamples.Tests.Bots -{ - public class DialogBotTests - { - //[Fact] - //public async Task LogsInformationToILogger() - //{ - // // Arrange - // var memoryStorage = new MemoryStorage(); - // var conversationState = new ConversationState(memoryStorage); - // var userState = new UserState(memoryStorage); - - // var mockRootDialog = SimpleMockFactory.CreateMockDialog(null, "mockRootDialog"); - // var mockLogger = new Mock>>(); - // mockLogger.Setup(x => - // x.Log(It.IsAny(), It.IsAny(), It.IsAny(), null, It.IsAny>())); - - // // Run the bot - // var sut = new DialogBot(conversationState, userState, mockRootDialog.Object, mockLogger.Object); - // var testAdapter = new TestAdapter(); - // var testFlow = new TestFlow(testAdapter, sut); - // await testFlow.Send("Hi").StartTestAsync(); - - // // Assert that log was changed with the expected parameters - // mockLogger.Verify( - // x => x.Log( - // LogLevel.Information, - // It.IsAny(), - // It.Is(o => o.ToString() == "Running dialog with Message Activity."), - // null, - // It.IsAny>()), - // Times.Once); - //} - - [Fact] - public async Task SavesTurnStateUsingMockWithVirtualSaveChangesAsync() - { - // Note: this test requires that SaveChangesAsync is made virtual in order to be able to create a mock. - var memoryStorage = new MemoryStorage(); - var mockConversationState = new Mock(memoryStorage) - { - CallBase = true, - }; - - var mockUserState = new Mock(memoryStorage) - { - CallBase = true, - }; - - var mockRootDialog = SimpleMockFactory.CreateMockDialog(null, "mockRootDialog"); - var mockLogger = new Mock>>(); - - // Act - var sut = new DialogBot(mockConversationState.Object, mockUserState.Object, mockRootDialog.Object, mockLogger.Object); - var testAdapter = new TestAdapter(); - var testFlow = new TestFlow(testAdapter, sut); - await testFlow.Send("Hi").StartTestAsync(); - - // Assert that SaveChangesAsync was called - mockConversationState.Verify(x => x.SaveChangesAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); - mockUserState.Verify(x => x.SaveChangesAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); - } - - [Fact(Skip = "TODO: need to figure out how to implement this version of the test")] - public async Task SavesTurnStateUsingMemoryStorage() - { - // TODO: Figure out how to implement this test. - // Note: this doesn't require a virtual SaveChangesAsync and it manually inspects storage to ensure the save methods were called. - var memoryStorage = new MemoryStorage(); - var conversationState = new ConversationState(memoryStorage); - var userState = new UserState(memoryStorage); - - var mockRootDialog = new Mock("mockRootDialog"); - mockRootDialog.Setup(x => x.ContinueDialogAsync(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult(new DialogTurnResult(DialogTurnStatus.Empty))); - - var mockLogger = new Mock>>(); - - // Run the bot - var sut = new DialogBot(conversationState, userState, mockRootDialog.Object, mockLogger.Object); - var testAdapter = new TestAdapter(); - var testFlow = new TestFlow(testAdapter, sut); - await testFlow.Send("Hi").StartTestAsync(); - - // Assert that SaveChangesAsyncWasCalled - Assert.True(false, "TODO"); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Controllers/BotControllerTests.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Controllers/BotControllerTests.cs deleted file mode 100644 index fd9fdabe58..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Controllers/BotControllerTests.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.AspNetCore.Routing; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Integration.AspNet.Core; -using Moq; -using Xunit; - -namespace Microsoft.BotBuilderSamples.Tests.Controllers -{ - public class BotControllerTests - { - [Fact] - public async Task PostAsyncCallsProcessAsyncOnAdapter() - { - // Create MVC infrastructure mocks and objects - var request = new Mock(); - var response = new Mock(); - var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Request).Returns(request.Object); - mockHttpContext.Setup(x => x.Response).Returns(response.Object); - var actionContext = new ActionContext(mockHttpContext.Object, new RouteData(), new ControllerActionDescriptor()); - - // Create BF mocks - var mockAdapter = new Mock(); - mockAdapter - .Setup(x => x.ProcessAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(Task.CompletedTask); - var mockBot = new Mock(); - - // Create and initialize controller - var sut = new BotController(mockAdapter.Object, (s) => mockBot.Object) - { - ControllerContext = new ControllerContext(actionContext), - }; - - // Invoke the controller - await sut.PostAsync("doesn't matter"); - - // Assert - mockAdapter.Verify( - x => x.ProcessAsync( - It.Is(o => o == request.Object), - It.Is(o => o == response.Object), - It.Is(o => o == mockBot.Object), - It.IsAny()), - Times.Once); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/BookingDialogTests.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/BookingDialogTests.cs deleted file mode 100644 index b302b2d097..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/BookingDialogTests.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder.Testing; -using Microsoft.Bot.Builder.Testing.XUnit; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.Services; -using Microsoft.BotBuilderSamples.Tests.Dialogs.TestData; -using Microsoft.BotBuilderSamples.Tests.Framework; -using Moq; -using Xunit; -using Xunit.Abstractions; - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs -{ - public class BookingDialogTests : BotTestBase - { - private readonly XUnitDialogTestLogger[] _middlewares; - - public BookingDialogTests(ITestOutputHelper output) - : base(output) - { - _middlewares = new[] { new XUnitDialogTestLogger(output) }; - } - - [Theory] - [MemberData(nameof(BookingDialogTestsDataGenerator.BookingFlows), MemberType = typeof(BookingDialogTestsDataGenerator))] - public async Task DialogFlowUseCases(TestDataObject testData) - { - // Arrange - var bookingTestData = testData.GetObject(); - var mockFlightBookingService = new Mock(); - mockFlightBookingService - .Setup(x => x.BookFlight(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult(bookingTestData.FlightBookingServiceResult)); - - var mockGetBookingDetailsDialog = SimpleMockFactory.CreateMockDialog(bookingTestData.GetBookingDetailsDialogResult).Object; - - var sut = new BookingDialog(mockGetBookingDetailsDialog, mockFlightBookingService.Object); - var testClient = new DialogTestClient(Channels.Test, sut, middlewares: _middlewares); - - // Act/Assert - Output.WriteLine($"Test Case: {bookingTestData.Name}"); - for (var i = 0; i < bookingTestData.UtterancesAndReplies.GetLength(0); i++) - { - var utterance = bookingTestData.UtterancesAndReplies[i, 0]; - - // Send the activity and receive the first reply or just pull the next - // activity from the queue if there's nothing to send - var reply = !string.IsNullOrEmpty(utterance) - ? await testClient.SendActivityAsync(utterance) - : testClient.GetNextReply(); - - Assert.Equal(bookingTestData.UtterancesAndReplies[i, 1], reply.Text); - } - - Assert.Equal(bookingTestData.ExpectedDialogResult.Status, testClient.DialogTurnResult.Status); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/CancelAndHelpDialogTests.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/CancelAndHelpDialogTests.cs deleted file mode 100644 index d64640cd76..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/CancelAndHelpDialogTests.cs +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Testing; -using Microsoft.Bot.Builder.Testing.XUnit; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.Tests.Framework; -using Xunit; -using Xunit.Abstractions; - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs -{ - public class CancelAndHelpDialogTests : BotTestBase - { - private readonly XUnitDialogTestLogger[] _middlewares; - - public CancelAndHelpDialogTests(ITestOutputHelper output) - : base(output) - { - _middlewares = new[] { new XUnitDialogTestLogger(output) }; - } - - [Theory] - [InlineData("hi", "Hi there", "cancel")] - [InlineData("hi", "Hi there", "quit")] - public async Task ShouldBeAbleToCancel(string utterance, string response, string cancelUtterance) - { - var sut = new TestCancelAndHelpDialog(); - var testClient = new DialogTestClient(Channels.Test, sut, middlewares: _middlewares); - - var reply = await testClient.SendActivityAsync(utterance); - Assert.Equal(response, reply.Text); - Assert.Equal(DialogTurnStatus.Waiting, testClient.DialogTurnResult.Status); - - reply = await testClient.SendActivityAsync(cancelUtterance); - Assert.Equal("Cancelling", reply.Text); - Assert.Equal(DialogTurnStatus.Complete, testClient.DialogTurnResult.Status); - } - - [Theory] - [InlineData("hi", "Hi there", "help")] - [InlineData("hi", "Hi there", "?")] - public async Task ShouldBeAbleToGetHelp(string utterance, string response, string cancelUtterance) - { - var sut = new TestCancelAndHelpDialog(); - var testClient = new DialogTestClient(Channels.Test, sut, middlewares: _middlewares); - - var reply = await testClient.SendActivityAsync(utterance); - Assert.Equal(response, reply.Text); - Assert.Equal(DialogTurnStatus.Waiting, testClient.DialogTurnResult.Status); - - reply = await testClient.SendActivityAsync(cancelUtterance); - Assert.Equal("Show Help...", reply.Text); - Assert.Equal(DialogTurnStatus.Waiting, testClient.DialogTurnResult.Status); - } - - /// - /// A concrete instance of for testing. - /// - private class TestCancelAndHelpDialog : CancelAndHelpDialog - { - public TestCancelAndHelpDialog() - : base(nameof(TestCancelAndHelpDialog)) - { - AddDialog(new TextPrompt(nameof(TextPrompt))); - var steps = new WaterfallStep[] - { - PromptStep, - FinalStep, - }; - AddDialog(new WaterfallDialog("testWaterfall", steps)); - InitialDialogId = "testWaterfall"; - } - - private async Task PromptStep(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Hi there") }, cancellationToken); - } - - private Task FinalStep(WaterfallStepContext stepContext, CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/DateResolverDialogTests.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/DateResolverDialogTests.cs deleted file mode 100644 index 86a011f2ed..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/DateResolverDialogTests.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading.Tasks; -using Microsoft.Bot.Builder.Testing; -using Microsoft.Bot.Builder.Testing.XUnit; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.Tests.Dialogs.TestData; -using Microsoft.BotBuilderSamples.Tests.Framework; -using Xunit; -using Xunit.Abstractions; - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs -{ - public class DateResolverDialogTests : BotTestBase - { - public DateResolverDialogTests(ITestOutputHelper output) - : base(output) - { - } - - [Theory] - [MemberData(nameof(DateResolverDialogTestsDataGenerator.DateResolverCases), MemberType = typeof(DateResolverDialogTestsDataGenerator))] - public async Task DialogFlowTests(TestDataObject testData) - { - // Arrange - var testCaseData = testData.GetObject(); - var sut = new DateResolverDialog(); - var testClient = new DialogTestClient(Channels.Test, sut, testCaseData.InitialData, new[] { new XUnitDialogTestLogger(Output) }); - - // Act/Assert - Output.WriteLine($"Test Case: {testCaseData.Name}"); - Output.WriteLine($"\r\nDialog Input: {testCaseData.InitialData}"); - for (var i = 0; i < testCaseData.UtterancesAndReplies.GetLength(0); i++) - { - var reply = await testClient.SendActivityAsync(testCaseData.UtterancesAndReplies[i, 0]); - Assert.Equal(testCaseData.UtterancesAndReplies[i, 1], reply?.Text); - } - - Output.WriteLine($"\r\nDialog result: {testClient.DialogTurnResult.Result}"); - Assert.Equal(testCaseData.ExpectedResult, testClient.DialogTurnResult.Result); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/GetBookingDetailsDialogTests.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/GetBookingDetailsDialogTests.cs deleted file mode 100644 index 31d2cf88cc..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/GetBookingDetailsDialogTests.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading.Tasks; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Testing; -using Microsoft.Bot.Builder.Testing.XUnit; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.Tests.Dialogs.TestData; -using Microsoft.BotBuilderSamples.Tests.Framework; -using Xunit; -using Xunit.Abstractions; - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs -{ - public class GetBookingDetailsDialogTests : BotTestBase - { - public GetBookingDetailsDialogTests(ITestOutputHelper output) - : base(output) - { - } - - [Theory] - [MemberData(nameof(GetBookingDetailsDialogTestsDataGenerator.BookingFlows), MemberType = typeof(GetBookingDetailsDialogTestsDataGenerator))] - [MemberData(nameof(GetBookingDetailsDialogTestsDataGenerator.CancelFlows), MemberType = typeof(GetBookingDetailsDialogTestsDataGenerator))] - public async Task DialogFlowUseCases(TestDataObject testData) - { - // Arrange - var bookingTestData = testData.GetObject(); - var sut = new GetBookingDetailsDialog(); - var testClient = new DialogTestClient(Channels.Test, sut, bookingTestData.InitialBookingDetails, new[] { new XUnitDialogTestLogger(Output) }); - - // Act/Assert - Output.WriteLine($"Test Case: {bookingTestData.Name}"); - for (var i = 0; i < bookingTestData.UtterancesAndReplies.GetLength(0); i++) - { - var reply = await testClient.SendActivityAsync(bookingTestData.UtterancesAndReplies[i, 0]); - Assert.Equal(bookingTestData.UtterancesAndReplies[i, 1], reply?.Text); - } - - if (testClient.DialogTurnResult.Result != null) - { - var bookingResults = (BookingDetails)testClient.DialogTurnResult.Result; - Assert.Equal(bookingTestData.ExpectedBookingDetails.Origin, bookingResults.Origin); - Assert.Equal(bookingTestData.ExpectedBookingDetails.Destination, bookingResults.Destination); - Assert.Equal(bookingTestData.ExpectedBookingDetails.TravelDate, bookingResults.TravelDate); - } - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/MainDialogTestFlowTests.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/MainDialogTestFlowTests.cs deleted file mode 100644 index 88dc23e002..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/MainDialogTestFlowTests.cs +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Adapters; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.Services; -using Microsoft.BotBuilderSamples.Tests.Framework; -using Microsoft.Extensions.Logging; -using Moq; -using Xunit; - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs -{ - /// - /// This sample uses the current classes and approach for testing bot conversations. - /// Note: this is included just as a reference. - /// - public class MainDialogTestFlowTests : BotTestBase - { - [Fact(Skip = "Ignoring this one, this is just a sample on the old way of writing tests")] - public async Task WholeEnchilada() - { - var mockFlightBookingService = new Mock(); - mockFlightBookingService.Setup(x => x.BookFlight(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult(true)); - var mockBookingDialog = SimpleMockFactory.CreateMockDialog(null, mockFlightBookingService.Object).Object; - var mockLogger = new Mock>(); - var sut = new MainDialog(mockLogger.Object, null, mockBookingDialog); - - var testFlow = BuildTestFlow(sut); - - await testFlow.Send("hi") - .AssertReply("What can I help you with today?") - .Send("hi") - .AssertReply("Where would you like to travel to?") - .Send("Bahamas") - .AssertReply("Where are you traveling from?") - .Send("New York") - .AssertReply("When would you like to travel?") - .Send("tomorrow at 5 PM") - .AssertReply(activity => - { - // TODO: I had to add the Yes No for the channelId = test, the emulator displays suggested actions instead. - var message = (IMessageActivity)activity; - Assert.Equal( - "Please confirm, I have you traveling to: Bahamas from: New York on: 2019-04-18T17 (1) Yes or (2) No", - message.Text); - }) - .Send("Yes") - .AssertReply("I have you booked to Bahamas from New York on tomorrow 5PM") - .StartTestAsync(); - } - - private static TestFlow BuildTestFlow(Dialog targetDialog) - { - var convoState = new ConversationState(new MemoryStorage()); - var testAdapter = new TestAdapter() - .Use(new AutoSaveStateMiddleware(convoState)); - var dialogState = convoState.CreateProperty("DialogState"); - var testFlow = new TestFlow(testAdapter, async (turnContext, cancellationToken) => - { - var state = await dialogState.GetAsync(turnContext, () => new DialogState(), cancellationToken); - var dialogs = new DialogSet(dialogState); - - dialogs.Add(targetDialog); - - var dc = await dialogs.CreateContextAsync(turnContext, cancellationToken); - - var results = await dc.ContinueDialogAsync(cancellationToken); - switch (results.Status) - { - case DialogTurnStatus.Empty: - await dc.BeginDialogAsync(targetDialog.Id, null, cancellationToken); - break; - case DialogTurnStatus.Complete: - { - // TODO: Dialog has ended, figure out a way of asserting that this is the case. - break; - } - } - }); - return testFlow; - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/MainDialogTests.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/MainDialogTests.cs deleted file mode 100644 index d9bf2a9d6e..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/MainDialogTests.cs +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Testing; -using Microsoft.Bot.Builder.Testing.XUnit; -using Microsoft.Bot.Connector; -using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.CognitiveModels; -using Microsoft.BotBuilderSamples.Services; -using Microsoft.BotBuilderSamples.Tests.Framework; -using Microsoft.Extensions.Logging; -using Moq; -using Xunit; -using Xunit.Abstractions; - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs -{ - public class MainDialogTests : BotTestBase - { - private readonly BookingDialog _mockBookingDialog; - private readonly Mock> _mockLogger; - - public MainDialogTests(ITestOutputHelper output) - : base(output) - { - _mockLogger = new Mock>(); - - var mockFlightBookingService = new Mock(); - mockFlightBookingService - .Setup(x => x.BookFlight(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult(true)); - _mockBookingDialog = SimpleMockFactory.CreateMockDialog(null, new Mock().Object, mockFlightBookingService.Object).Object; - } - - [Fact] - public void DialogConstructor() - { - var sut = new MainDialog(_mockLogger.Object, null, _mockBookingDialog); - - Assert.Equal("MainDialog", sut.Id); - Assert.IsType(sut.FindDialog("TextPrompt")); - Assert.NotNull(sut.FindDialog("BookingDialog")); - Assert.IsType(sut.FindDialog("WaterfallDialog")); - } - - [Fact] - public async Task ShowsMessageIfLuisNotConfigured() - { - // Arrange - var sut = new MainDialog(_mockLogger.Object, null, _mockBookingDialog); - var testClient = new DialogTestClient(Channels.Test, sut, middlewares: new[] { new XUnitDialogTestLogger(Output) }); - - // Act/Assert - var reply = await testClient.SendActivityAsync("hi"); - Assert.Equal("NOTE: LUIS is not configured. To enable all capabilities, add 'LuisAppId', 'LuisAPIKey' and 'LuisAPIHostName' to the appsettings.json file.", reply.Text); - - reply = testClient.GetNextReply(); - Assert.Equal("What can I help you with today?", reply.Text); - } - - [Fact] - public async Task ShowsPromptIfLuisIsConfigured() - { - // Arrange - var sut = new MainDialog(_mockLogger.Object, SimpleMockFactory.CreateMockLuisRecognizer(null).Object, _mockBookingDialog); - var testClient = new DialogTestClient(Channels.Test, sut, middlewares: new[] { new XUnitDialogTestLogger(Output) }); - - // Act/Assert - var reply = await testClient.SendActivityAsync("hi"); - Assert.Equal("What can I help you with today?", reply.Text); - } - - [Theory] - [InlineData("I want to book a flight", "BookFlight", "BookingDialog mock invoked")] - [InlineData("What's the weather like?", "GetWeather", "TODO: get weather flow here")] - [InlineData("bananas", "None", "Sorry, I didn't get that. Please try asking in a different way (intent was None)")] - public async Task TaskSelector(string utterance, string intent, string invokedDialogResponse) - { - var mockLuisRecognizer = SimpleMockFactory.CreateMockLuisRecognizer( - new FlightBooking - { - Intents = new Dictionary - { - { Enum.Parse(intent), new IntentScore() { Score = 1 } }, - }, - Entities = new FlightBooking._Entities(), - }); - - var sut = new MainDialog(_mockLogger.Object, mockLuisRecognizer.Object, _mockBookingDialog); - var testClient = new DialogTestClient(Channels.Test, sut, middlewares: new[] { new XUnitDialogTestLogger(Output) }); - - var reply = await testClient.SendActivityAsync("hi"); - Assert.Equal("What can I help you with today?", reply.Text); - - reply = await testClient.SendActivityAsync(utterance); - Assert.Equal(invokedDialogResponse, reply.Text); - - reply = testClient.GetNextReply(); - Assert.Equal("What else can I do for you?", reply.Text); - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/BookingDialogTestCase.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/BookingDialogTestCase.cs deleted file mode 100644 index ff0ae7bf3e..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/BookingDialogTestCase.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Microsoft.Bot.Builder.Dialogs; - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs.TestData -{ - public class BookingDialogTestCase - { - /// - /// Gets or sets the name for the test case. - /// - /// The test case name. - public string Name { get; set; } - - public BookingDetails GetBookingDetailsDialogResult { get; set; } - - public string[,] UtterancesAndReplies { get; set; } - - public DialogTurnResult ExpectedDialogResult { get; set; } - - public bool BookedSuccessfully { get; set; } - - public bool FlightBookingServiceResult { get; set; } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/BookingDialogTestsDataGenerator.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/BookingDialogTestsDataGenerator.cs deleted file mode 100644 index ab05e3abab..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/BookingDialogTestsDataGenerator.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Testing.XUnit; - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs.TestData -{ - [SuppressMessage("Microsoft.StyleCop.CSharp.OrderingRules", "SA1118:ParameterMustNotSpanMultipleLines", Justification = "Ignoring to make code more readable")] - public class BookingDialogTestsDataGenerator - { - public static IEnumerable BookingFlows() - { - yield return BuildTestCaseObject( - "Full flow", - new BookingDetails - { - Destination = "Seattle", - Origin = "New York", - TravelDate = $"{DateTime.Now.AddDays(1):yyyy-MM-dd}", - }, - new[,] - { - { "hi", "GetBookingDetailsDialog mock invoked" }, - { null, $"Please confirm, I have you traveling to: Seattle from: New York on: {DateTime.Now.AddDays(1):yyyy-MM-dd} (1) Yes or (2) No" }, - { "yes", "Booking your flight, this shouldn't take long..." }, - { null, "I have you booked to Seattle from New York on tomorrow" }, - }); - - yield return BuildTestCaseObject( - "Full flow with 'no' at confirmation", - new BookingDetails - { - Destination = "Seattle", - Origin = "New York", - TravelDate = $"{DateTime.Now.AddDays(1):yyyy-MM-dd}", - }, - new[,] - { - { "hi", "GetBookingDetailsDialog mock invoked" }, - { null, $"Please confirm, I have you traveling to: Seattle from: New York on: {DateTime.Now.AddDays(1):yyyy-MM-dd} (1) Yes or (2) No" }, - { "no", "OK, we can do this later" }, - }); - - yield return BuildTestCaseObject( - "Full flow with 'cancel' at confirmation", - new BookingDetails - { - Destination = "Seattle", - Origin = "New York", - TravelDate = $"{DateTime.Now.AddDays(1):yyyy-MM-dd}", - }, - new[,] - { - { "hi", "GetBookingDetailsDialog mock invoked" }, - { null, $"Please confirm, I have you traveling to: Seattle from: New York on: {DateTime.Now.AddDays(1):yyyy-MM-dd} (1) Yes or (2) No" }, - { "cancel", "Cancelling" }, - }, - true, - new DialogTurnResult(DialogTurnStatus.Complete)); - - yield return BuildTestCaseObject( - "Full flow with failed call to FlightBookingService", - new BookingDetails - { - Destination = "Seattle", - Origin = "New York", - TravelDate = $"{DateTime.Now.AddDays(1):yyyy-MM-dd}", - }, - new[,] - { - { "hi", "GetBookingDetailsDialog mock invoked" }, - { null, $"Please confirm, I have you traveling to: Seattle from: New York on: {DateTime.Now.AddDays(1):yyyy-MM-dd} (1) Yes or (2) No" }, - { "yes", "Booking your flight, this shouldn't take long..." }, - { null, "Sorry, I was unable to secure your reservation, please try another flight" }, - }, false); - } - - private static object[] BuildTestCaseObject(string testCaseName, BookingDetails inputBookingInfo, string[,] utterancesAndReplies, bool flightBookingServiceResult = true, DialogTurnResult expectedDialogTurnResult = null) - { - var testData = new BookingDialogTestCase - { - Name = testCaseName, - GetBookingDetailsDialogResult = inputBookingInfo, - UtterancesAndReplies = utterancesAndReplies, - FlightBookingServiceResult = flightBookingServiceResult, - ExpectedDialogResult = expectedDialogTurnResult ?? new DialogTurnResult(DialogTurnStatus.Complete), - }; - return new object[] { new TestDataObject(testData) }; - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/DateResolverDialogTestCase.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/DateResolverDialogTestCase.cs deleted file mode 100644 index b0b4ed9980..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/DateResolverDialogTestCase.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs.TestData -{ - public class DateResolverDialogTestCase - { - /// - /// Gets or sets the name for the test case. - /// - /// The test case name. - public string Name { get; set; } - - public string InitialData { get; set; } - - public string ExpectedResult { get; set; } - - public string[,] UtterancesAndReplies { get; set; } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/DateResolverDialogTestsDataGenerator.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/DateResolverDialogTestsDataGenerator.cs deleted file mode 100644 index 56054f10c8..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/DateResolverDialogTestsDataGenerator.cs +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using Microsoft.Bot.Builder.Testing.XUnit; - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs.TestData -{ - [SuppressMessage("Microsoft.StyleCop.CSharp.OrderingRules", "SA1118:ParameterMustNotSpanMultipleLines", Justification = "Ignoring to make code more readable")] - - public class DateResolverDialogTestsDataGenerator - { - public static IEnumerable DateResolverCases() - { - yield return BuildTestCaseObject( - "tomorrow", - null, - $"{DateTime.Now.AddDays(1):yyyy-MM-dd}", - new[,] - { - { "hi", "When would you like to travel?" }, - { "tomorrow", null }, - }); - - yield return BuildTestCaseObject( - "the day after tomorrow", - null, - $"{DateTime.Now.AddDays(2):yyyy-MM-dd}", - new[,] - { - { "hi", "When would you like to travel?" }, - { "the day after tomorrow", null }, - }); - - yield return BuildTestCaseObject( - "two days from now", - null, - $"{DateTime.Now.AddDays(2):yyyy-MM-dd}", - new[,] - { - { "hi", "When would you like to travel?" }, - { "two days from now", null }, - }); - - yield return BuildTestCaseObject( - "valid input given (tomorrow)", - $"{DateTime.Now.AddDays(1):yyyy-MM-dd}", - $"{DateTime.Now.AddDays(1):yyyy-MM-dd}", - new[,] - { - { "hi", null }, - }); - - yield return BuildTestCaseObject( - "retry prompt", - null, - $"{DateTime.Now.AddDays(1):yyyy-MM-dd}", - new[,] - { - { "hi", "When would you like to travel?" }, - { "bananas", "I'm sorry, to make your booking please enter a full travel date including Day Month and Year." }, - { "tomorrow", null }, - }); - - yield return BuildTestCaseObject( - "fuzzy time ", - null, - $"2055-05-05", - new[,] - { - { "hi", "When would you like to travel?" }, - { "may 5th", "I'm sorry, to make your booking please enter a full travel date including Day Month and Year." }, - { "may 5th 2055", null }, - }); - } - - private static object[] BuildTestCaseObject(string testCaseName, string input, string result, string[,] utterancesAndReplies) - { - var testData = new DateResolverDialogTestCase - { - Name = testCaseName, - InitialData = input, - ExpectedResult = result, - UtterancesAndReplies = utterancesAndReplies, - }; - return new object[] { new TestDataObject(testData) }; - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/GetBookingDetailsDialogTestCase.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/GetBookingDetailsDialogTestCase.cs deleted file mode 100644 index ebea20eeb2..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/GetBookingDetailsDialogTestCase.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs.TestData -{ - public class GetBookingDetailsDialogTestCase - { - /// - /// Gets or sets the name for the test case. - /// - /// The test case name. - public string Name { get; set; } - - public BookingDetails InitialBookingDetails { get; set; } - - public string[,] UtterancesAndReplies { get; set; } - - public BookingDetails ExpectedBookingDetails { get; set; } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/GetBookingDetailsDialogTestsDataGenerator.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/GetBookingDetailsDialogTestsDataGenerator.cs deleted file mode 100644 index 0a991f9cd6..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/GetBookingDetailsDialogTestsDataGenerator.cs +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using Microsoft.Bot.Builder.Testing.XUnit; - -namespace Microsoft.BotBuilderSamples.Tests.Dialogs.TestData -{ - [SuppressMessage("Microsoft.StyleCop.CSharp.OrderingRules", "SA1118:ParameterMustNotSpanMultipleLines", Justification = "Ignoring to make code more readable")] - public class GetBookingDetailsDialogTestsDataGenerator - { - public static IEnumerable BookingFlows() - { - yield return BuildTestCaseObject( - "Full flow", - new BookingDetails(), - new[,] - { - { "hi", "Where would you like to travel to?" }, - { "Seattle", "Where are you traveling from?" }, - { "New York", "When would you like to travel?" }, - { $"{DateTime.UtcNow.AddDays(1):yyyy-MM-dd}", null }, - }, - new BookingDetails - { - Destination = "Seattle", - Origin = "New York", - TravelDate = $"{DateTime.UtcNow.AddDays(1):yyyy-MM-dd}", - }); - - yield return BuildTestCaseObject( - "Destination given", - new BookingDetails - { - Destination = "Bahamas", - Origin = null, - TravelDate = null, - }, - new[,] - { - { "hi", "Where are you traveling from?" }, - { "New York", "When would you like to travel?" }, - { $"{DateTime.UtcNow.AddDays(1):yyyy-MM-dd}", null }, - }, - new BookingDetails - { - Destination = "Bahamas", - Origin = "New York", - TravelDate = $"{DateTime.UtcNow.AddDays(1):yyyy-MM-dd}", - }); - - yield return BuildTestCaseObject( - "Destination and Origin given", - new BookingDetails - { - Destination = "Seattle", - Origin = "New York", - TravelDate = null, - }, - new[,] - { - { "hi", "When would you like to travel?" }, - { $"{DateTime.UtcNow.AddDays(1):yyyy-MM-dd}", null }, - }, - new BookingDetails - { - Destination = "Seattle", - Origin = "New York", - TravelDate = $"{DateTime.UtcNow.AddDays(1):yyyy-MM-dd}", - }); - - yield return BuildTestCaseObject( - "All booking details given for today", - new BookingDetails - { - Destination = "Seattle", - Origin = "Bahamas", - TravelDate = $"{DateTime.UtcNow:yyyy-MM-dd}", - }, - new[,] - { - { "hi", null }, - }, - new BookingDetails - { - Destination = "Seattle", - Origin = "Bahamas", - TravelDate = $"{DateTime.UtcNow:yyyy-MM-dd}", - }); - } - - public static IEnumerable CancelFlows() - { - yield return BuildTestCaseObject( - "Cancel on origin prompt", - new BookingDetails(), - new[,] - { - { "hi", "Where would you like to travel to?" }, - { "cancel", "Cancelling" }, - }, - null); - - yield return BuildTestCaseObject( - "Cancel on destination prompt", - new BookingDetails(), - new[,] - { - { "hi", "Where would you like to travel to?" }, - { "Seattle", "Where are you traveling from?" }, - { "cancel", "Cancelling" }, - }, - null); - - yield return BuildTestCaseObject( - "Cancel on date prompt", - new BookingDetails(), - new[,] - { - { "hi", "Where would you like to travel to?" }, - { "Seattle", "Where are you traveling from?" }, - { "New York", "When would you like to travel?" }, - { "cancel", "Cancelling" }, - }, - null); - } - - private static object[] BuildTestCaseObject(string testCaseName, BookingDetails inputBookingInfo, string[,] utterancesAndReplies, BookingDetails expectedBookingInfo) - { - var testData = new GetBookingDetailsDialogTestCase - { - Name = testCaseName, - InitialBookingDetails = inputBookingInfo, - UtterancesAndReplies = utterancesAndReplies, - ExpectedBookingDetails = expectedBookingInfo, - }; - return new object[] { new TestDataObject(testData) }; - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/README.md b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/README.md deleted file mode 100644 index 6fa30a60d9..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Dialogs/TestData/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Note -This folder contains data generators and test case object definitions for Theory tests. \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/BotTestBase.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/BotTestBase.cs deleted file mode 100644 index 0957aba44d..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/BotTestBase.cs +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.IO; -using System.Linq; -using Microsoft.Extensions.Configuration; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Xunit.Abstractions; - -namespace Microsoft.BotBuilderSamples.Tests.Framework -{ - /// - /// A base class with helper methods and properties to write bot tests. - /// - public abstract class BotTestBase - { - // A lazy configuration object that gets instantiated once during execution when is needed - private static readonly Lazy _configurationLazy = new Lazy(() => - { - LoadLaunchSettingsIntoEnvVariables("Properties//launchSettings.json"); - - var config = new ConfigurationBuilder() - .AddJsonFile("appsettings.json") - .AddEnvironmentVariables(); - - return config.Build(); - }); - - /// - /// Initializes a new instance of the class. - /// - protected BotTestBase() - : this(null) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// - /// An XUnit instance. - /// See Capturing Output in the XUnit documentation for additional details. - /// - protected BotTestBase(ITestOutputHelper output) - { - Output = output; - } - - public virtual IConfiguration Configuration => _configurationLazy.Value; - - protected ITestOutputHelper Output { get; } - - /// - /// Test runners don't load environment variables defined in launchSettings.json - /// so this helper code loads it manually if the file is present. - /// This is useful to be able to have your own key files in your local machine without - /// having to put them in git. - /// If you use launch settings, make sure you set the Copy to Output Directory property to Copy Always. - /// - /// The relative path to the launch settings file (i.e.: "Properties//launchSettings.json"). - private static void LoadLaunchSettingsIntoEnvVariables(string launchSettingsFile) - { - if (!File.Exists(launchSettingsFile)) - { - return; - } - - using (var file = File.OpenText(launchSettingsFile)) - { - var reader = new JsonTextReader(file); - var fileData = JObject.Load(reader); - - var variables = fileData - .GetValue("profiles") - .SelectMany(profiles => profiles.Children()) - .SelectMany(profile => profile.Children()) - .Where(prop => prop.Name == "environmentVariables") - .SelectMany(prop => prop.Value.Children()) - .ToList(); - - foreach (var variable in variables) - { - Environment.SetEnvironmentVariable(variable.Name, variable.Value.ToString()); - } - } - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/README.md b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/README.md deleted file mode 100644 index 8ff67a6f01..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Note -This folder contains a set of helper classes and extensions that could eventually be moved to the testing framework. \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/SimpleMockFactory.cs b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/SimpleMockFactory.cs deleted file mode 100644 index 76831e38e6..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Framework/SimpleMockFactory.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Bot.Builder; -using Microsoft.Bot.Builder.Dialogs; -using Moq; - -namespace Microsoft.BotBuilderSamples.Tests.Framework -{ - /// - /// Contains utility methods for creating simple mock objects based on moq/>. - /// - public static class SimpleMockFactory - { - /// - /// Creates a simple mock dialog. - /// - /// A derived type. - /// An object containing the results returned by the dialog ind the Dialog in the . - /// Optional constructor parameters for the dialog. - /// A object for the desired dialog type. - public static Mock CreateMockDialog(object expectedResult = null, params object[] constructorParams) - where T : Dialog - { - var mockDialog = new Mock(constructorParams); - var mockDialogNameTypeName = typeof(T).Name; - mockDialog - .Setup(x => x.BeginDialogAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(async (DialogContext dialogContext, object options, CancellationToken cancellationToken) => - { - await dialogContext.Context.SendActivityAsync($"{mockDialogNameTypeName} mock invoked", cancellationToken: cancellationToken); - - return await dialogContext.EndDialogAsync(expectedResult, cancellationToken); - }); - - return mockDialog; - } - - /// - /// Creates a simple mock object that returns the desired result. - /// - /// The type of to create. - /// The type of to return. - /// The value to return when gets called. - /// A instance. - public static Mock CreateMockLuisRecognizer(TReturns returns) - where TRecognizer : class, IRecognizer - where TReturns : IRecognizerConvert, new() - { - var mockRecognizer = new Mock(); - mockRecognizer - .Setup(x => x.RecognizeAsync(It.IsAny(), It.IsAny())) - .Returns(() => Task.FromResult(returns)); - return mockRecognizer; - } - - /// - /// Creates a simple mock object that returns the desired result. - /// - /// The type of to create. - /// The value to return when gets called. - /// A instance. - public static Mock CreateMockLuisRecognizer(RecognizerResult returns) - where TRecognizer : class, IRecognizer - { - var mockRecognizer = new Mock(); - mockRecognizer - .Setup(x => x.RecognizeAsync(It.IsAny(), It.IsAny())) - .Returns(() => Task.FromResult(returns)); - return mockRecognizer; - } - } -} diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests.csproj b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests.csproj deleted file mode 100644 index 07010eed98..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests.csproj +++ /dev/null @@ -1,45 +0,0 @@ - - - - netcoreapp2.1 - false - Microsoft.Bot.Builder.TestBot.NetCore21.Tests - Microsoft.BotBuilderSamples.Tests - - - - - - - - - Always - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - Always - - - - - PreserveNewest - - - \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/appsettings.json b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/appsettings.json deleted file mode 100644 index 0a7b898b13..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "cognitiveModels": { - "flightBooking": { - "luisAppId": "Set the value here or in launchSettings.json for local dev", - "luisEndpointKey": "Set the value here or in launchSettings.json for local dev", - "luisEndpoint": "Set the value here or in launchSettings.json for local dev" - } - } -} \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/stylecop.json b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/stylecop.json deleted file mode 100644 index 5f7ae36c3f..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/stylecop.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "settings": { - "namingRules": { - "allowCommonHungarianPrefixes": true, - "allowedHungarianPrefixes": [ - "lu" - ] - } - } -} \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/xunit.runner.json b/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/xunit.runner.json deleted file mode 100644 index dd04495160..0000000000 --- a/tests/Microsoft.Bot.Builder.TestBot.NetCore21.Tests/xunit.runner.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json", - "parallelizeAssembly": true -} \ No newline at end of file diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Bots/DialogAndWelcomeBotTests.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Bots/DialogAndWelcomeBotTests.cs index aab044afe1..880afab0fd 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Bots/DialogAndWelcomeBotTests.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Bots/DialogAndWelcomeBotTests.cs @@ -5,6 +5,7 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Adapters; using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared.Bots; using Microsoft.Bot.Connector; using Microsoft.Bot.Schema; using Microsoft.BotBuilderSamples.Tests.Framework; diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Bots/DialogBotTests.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Bots/DialogBotTests.cs index 4ae8ed697c..38df561f4d 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Bots/DialogBotTests.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Bots/DialogBotTests.cs @@ -4,6 +4,7 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Adapters; using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared.Bots; using Microsoft.BotBuilderSamples.Tests.Framework; using Microsoft.Extensions.Logging; using Moq; diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Controllers/BotControllerTests.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Controllers/BotControllerTests.cs index fd9fdabe58..a843e03eb4 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Controllers/BotControllerTests.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Controllers/BotControllerTests.cs @@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Routing; using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Integration.AspNet.Core; +using Microsoft.Bot.Builder.TestBot.Shared.Controllers; using Moq; using Xunit; diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/BookingDialogTests.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/BookingDialogTests.cs index b302b2d097..3a2897bd72 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/BookingDialogTests.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/BookingDialogTests.cs @@ -3,11 +3,13 @@ using System.Threading; using System.Threading.Tasks; +using Microsoft.Bot.Builder.TestBot.Shared; +using Microsoft.Bot.Builder.TestBot.Shared.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared.Services; using Microsoft.Bot.Builder.Testing; using Microsoft.Bot.Builder.Testing.XUnit; using Microsoft.Bot.Connector; using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.Services; using Microsoft.BotBuilderSamples.Tests.Dialogs.TestData; using Microsoft.BotBuilderSamples.Tests.Framework; using Moq; diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/CancelAndHelpDialogTests.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/CancelAndHelpDialogTests.cs index d64640cd76..2fecbe50da 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/CancelAndHelpDialogTests.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/CancelAndHelpDialogTests.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared.Dialogs; using Microsoft.Bot.Builder.Testing; using Microsoft.Bot.Builder.Testing.XUnit; using Microsoft.Bot.Connector; diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/DateResolverDialogTests.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/DateResolverDialogTests.cs index 86a011f2ed..7cffa73d92 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/DateResolverDialogTests.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/DateResolverDialogTests.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System.Threading.Tasks; +using Microsoft.Bot.Builder.TestBot.Shared.Dialogs; using Microsoft.Bot.Builder.Testing; using Microsoft.Bot.Builder.Testing.XUnit; using Microsoft.Bot.Connector; diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/GetBookingDetailsDialogTests.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/GetBookingDetailsDialogTests.cs index 31d2cf88cc..80773d2de3 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/GetBookingDetailsDialogTests.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/GetBookingDetailsDialogTests.cs @@ -3,6 +3,8 @@ using System.Threading.Tasks; using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared; +using Microsoft.Bot.Builder.TestBot.Shared.Dialogs; using Microsoft.Bot.Builder.Testing; using Microsoft.Bot.Builder.Testing.XUnit; using Microsoft.Bot.Connector; diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/MainDialogTestFlowTests.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/MainDialogTestFlowTests.cs index 88dc23e002..1c57eab125 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/MainDialogTestFlowTests.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/MainDialogTestFlowTests.cs @@ -6,8 +6,10 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Adapters; using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared; +using Microsoft.Bot.Builder.TestBot.Shared.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared.Services; using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.Services; using Microsoft.BotBuilderSamples.Tests.Framework; using Microsoft.Extensions.Logging; using Moq; diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/MainDialogTests.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/MainDialogTests.cs index d9bf2a9d6e..b7ce8d4c89 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/MainDialogTests.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/MainDialogTests.cs @@ -7,12 +7,14 @@ using System.Threading.Tasks; using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared; +using Microsoft.Bot.Builder.TestBot.Shared.CognitiveModels; +using Microsoft.Bot.Builder.TestBot.Shared.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared.Services; using Microsoft.Bot.Builder.Testing; using Microsoft.Bot.Builder.Testing.XUnit; using Microsoft.Bot.Connector; using Microsoft.Bot.Schema; -using Microsoft.BotBuilderSamples.CognitiveModels; -using Microsoft.BotBuilderSamples.Services; using Microsoft.BotBuilderSamples.Tests.Framework; using Microsoft.Extensions.Logging; using Moq; diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/BookingDialogTestCase.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/BookingDialogTestCase.cs index ff0ae7bf3e..1f79cf2579 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/BookingDialogTestCase.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/BookingDialogTestCase.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared; namespace Microsoft.BotBuilderSamples.Tests.Dialogs.TestData { diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/BookingDialogTestsDataGenerator.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/BookingDialogTestsDataGenerator.cs index ab05e3abab..0498322e99 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/BookingDialogTestsDataGenerator.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/BookingDialogTestsDataGenerator.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using Microsoft.Bot.Builder.Dialogs; +using Microsoft.Bot.Builder.TestBot.Shared; using Microsoft.Bot.Builder.Testing.XUnit; namespace Microsoft.BotBuilderSamples.Tests.Dialogs.TestData diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/GetBookingDetailsDialogTestCase.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/GetBookingDetailsDialogTestCase.cs index ebea20eeb2..6f3b5c4a39 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/GetBookingDetailsDialogTestCase.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/GetBookingDetailsDialogTestCase.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using Microsoft.Bot.Builder.TestBot.Shared; + namespace Microsoft.BotBuilderSamples.Tests.Dialogs.TestData { public class GetBookingDetailsDialogTestCase diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/GetBookingDetailsDialogTestsDataGenerator.cs b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/GetBookingDetailsDialogTestsDataGenerator.cs index 0a991f9cd6..5df704cf67 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/GetBookingDetailsDialogTestsDataGenerator.cs +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Dialogs/TestData/GetBookingDetailsDialogTestsDataGenerator.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using Microsoft.Bot.Builder.TestBot.Shared; using Microsoft.Bot.Builder.Testing.XUnit; namespace Microsoft.BotBuilderSamples.Tests.Dialogs.TestData diff --git a/tests/Microsoft.Bot.Builder.TestBot.Tests/Microsoft.Bot.Builder.TestBot.Tests.csproj b/tests/Microsoft.Bot.Builder.TestBot.Tests/Microsoft.Bot.Builder.TestBot.Tests.csproj index f7b3d39fb7..73da546361 100644 --- a/tests/Microsoft.Bot.Builder.TestBot.Tests/Microsoft.Bot.Builder.TestBot.Tests.csproj +++ b/tests/Microsoft.Bot.Builder.TestBot.Tests/Microsoft.Bot.Builder.TestBot.Tests.csproj @@ -1,10 +1,14 @@  - netcoreapp3.1 + netcoreapp2.1 + netcoreapp3.1 + netcoreapp2.1;netcoreapp3.1 false Microsoft.Bot.Builder.TestBot.Tests Microsoft.BotBuilderSamples.Tests + false + Debug;Release @@ -17,8 +21,15 @@ - + + + + + + + + @@ -29,7 +40,7 @@ - + diff --git a/tests/tests.schema b/tests/tests.schema deleted file mode 100644 index 4b491a21b5..0000000000 --- a/tests/tests.schema +++ /dev/null @@ -1,12338 +0,0 @@ -{ - "$schema": "https://schemas.botframework.com/schemas/component/v1.0/component.schema", - "type": "object", - "title": "Component kinds", - "description": "These are all of the kinds that can be created by the loader.", - "oneOf": [ - { - "$ref": "#/definitions/AzureQueues.ContinueConversationLater" - }, - { - "$ref": "#/definitions/CustomAction.dialog" - }, - { - "$ref": "#/definitions/CustomAction2.dialog" - }, - { - "$ref": "#/definitions/Microsoft.ActivityTemplate" - }, - { - "$ref": "#/definitions/Microsoft.AdaptiveDialog" - }, - { - "$ref": "#/definitions/Microsoft.AgeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.Ask" - }, - { - "$ref": "#/definitions/Microsoft.AttachmentInput" - }, - { - "$ref": "#/definitions/Microsoft.BeginDialog" - }, - { - "$ref": "#/definitions/Microsoft.BeginSkill" - }, - { - "$ref": "#/definitions/Microsoft.BreakLoop" - }, - { - "$ref": "#/definitions/Microsoft.CancelAllDialogs" - }, - { - "$ref": "#/definitions/Microsoft.CancelDialog" - }, - { - "$ref": "#/definitions/Microsoft.ChoiceInput" - }, - { - "$ref": "#/definitions/Microsoft.ConditionalSelector" - }, - { - "$ref": "#/definitions/Microsoft.ConfirmInput" - }, - { - "$ref": "#/definitions/Microsoft.ConfirmationEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.ContinueLoop" - }, - { - "$ref": "#/definitions/Microsoft.CrossTrainedRecognizerSet" - }, - { - "$ref": "#/definitions/Microsoft.CurrencyEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.DateTimeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.DateTimeInput" - }, - { - "$ref": "#/definitions/Microsoft.DebugBreak" - }, - { - "$ref": "#/definitions/Microsoft.DeleteActivity" - }, - { - "$ref": "#/definitions/Microsoft.DeleteProperties" - }, - { - "$ref": "#/definitions/Microsoft.DeleteProperty" - }, - { - "$ref": "#/definitions/Microsoft.DimensionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.EditActions" - }, - { - "$ref": "#/definitions/Microsoft.EditArray" - }, - { - "$ref": "#/definitions/Microsoft.EmailEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.EmitEvent" - }, - { - "$ref": "#/definitions/Microsoft.EndDialog" - }, - { - "$ref": "#/definitions/Microsoft.EndTurn" - }, - { - "$ref": "#/definitions/Microsoft.FirstSelector" - }, - { - "$ref": "#/definitions/Microsoft.Foreach" - }, - { - "$ref": "#/definitions/Microsoft.ForeachPage" - }, - { - "$ref": "#/definitions/Microsoft.GetActivityMembers" - }, - { - "$ref": "#/definitions/Microsoft.GetConversationMembers" - }, - { - "$ref": "#/definitions/Microsoft.GotoAction" - }, - { - "$ref": "#/definitions/Microsoft.GuidEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.HashtagEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.HttpRequest" - }, - { - "$ref": "#/definitions/Microsoft.IfCondition" - }, - { - "$ref": "#/definitions/Microsoft.IpEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.LogAction" - }, - { - "$ref": "#/definitions/Microsoft.LuisRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.MentionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.MostSpecificSelector" - }, - { - "$ref": "#/definitions/Microsoft.MultiLanguageRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.NumberEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.NumberInput" - }, - { - "$ref": "#/definitions/Microsoft.NumberRangeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.OAuthInput" - }, - { - "$ref": "#/definitions/Microsoft.OnActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnAssignEntity" - }, - { - "$ref": "#/definitions/Microsoft.OnBeginDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnCancelDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseEntity" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseIntent" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseProperty" - }, - { - "$ref": "#/definitions/Microsoft.OnCondition" - }, - { - "$ref": "#/definitions/Microsoft.OnContinueConversation" - }, - { - "$ref": "#/definitions/Microsoft.OnConversationUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnDialogEvent" - }, - { - "$ref": "#/definitions/Microsoft.OnEndOfActions" - }, - { - "$ref": "#/definitions/Microsoft.OnEndOfConversationActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnError" - }, - { - "$ref": "#/definitions/Microsoft.OnEventActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnHandoffActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnInstallationUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnIntent" - }, - { - "$ref": "#/definitions/Microsoft.OnInvokeActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageDeleteActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageReactionActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnQnAMatch" - }, - { - "$ref": "#/definitions/Microsoft.OnRepromptDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnTypingActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnUnknownIntent" - }, - { - "$ref": "#/definitions/Microsoft.OrchestratorRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.OrdinalEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.PercentageEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.PhoneNumberEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.QnAMakerDialog" - }, - { - "$ref": "#/definitions/Microsoft.QnAMakerRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RandomSelector" - }, - { - "$ref": "#/definitions/Microsoft.RecognizerSet" - }, - { - "$ref": "#/definitions/Microsoft.RegexEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RegexRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RepeatDialog" - }, - { - "$ref": "#/definitions/Microsoft.ReplaceDialog" - }, - { - "$ref": "#/definitions/Microsoft.ResourceMultiLanguageGenerator" - }, - { - "$ref": "#/definitions/Microsoft.SendActivity" - }, - { - "$ref": "#/definitions/Microsoft.SetProperties" - }, - { - "$ref": "#/definitions/Microsoft.SetProperty" - }, - { - "$ref": "#/definitions/Microsoft.SignOutUser" - }, - { - "$ref": "#/definitions/Microsoft.StaticActivityTemplate" - }, - { - "$ref": "#/definitions/Microsoft.SwitchCondition" - }, - { - "$ref": "#/definitions/Microsoft.TelemetryTrackEvent" - }, - { - "$ref": "#/definitions/Microsoft.TemperatureEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.TemplateEngineLanguageGenerator" - }, - { - "$ref": "#/definitions/Microsoft.Test.AssertCondition" - }, - { - "$ref": "#/definitions/Microsoft.Test.AssertReply" - }, - { - "$ref": "#/definitions/Microsoft.Test.AssertReplyActivity" - }, - { - "$ref": "#/definitions/Microsoft.Test.AssertReplyOneOf" - }, - { - "$ref": "#/definitions/Microsoft.Test.CustomEvent" - }, - { - "$ref": "#/definitions/Microsoft.Test.HttpRequestSequenceMock" - }, - { - "$ref": "#/definitions/Microsoft.Test.MemoryAssertions" - }, - { - "$ref": "#/definitions/Microsoft.Test.Script" - }, - { - "$ref": "#/definitions/Microsoft.Test.SetProperties" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserActivity" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserConversationUpdate" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserDelay" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserSays" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserTokenBasicMock" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserTyping" - }, - { - "$ref": "#/definitions/Microsoft.TextInput" - }, - { - "$ref": "#/definitions/Microsoft.TextTemplate" - }, - { - "$ref": "#/definitions/Microsoft.TraceActivity" - }, - { - "$ref": "#/definitions/Microsoft.TrueSelector" - }, - { - "$ref": "#/definitions/Microsoft.UpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.UrlEntityRecognizer" - }, - { - "$ref": "#/definitions/Teams.OnAppBasedLinkQuery" - }, - { - "$ref": "#/definitions/Teams.OnCardAction" - }, - { - "$ref": "#/definitions/Teams.OnChannelCreated" - }, - { - "$ref": "#/definitions/Teams.OnChannelDeleted" - }, - { - "$ref": "#/definitions/Teams.OnChannelRenamed" - }, - { - "$ref": "#/definitions/Teams.OnChannelRestored" - }, - { - "$ref": "#/definitions/Teams.OnFileConsent" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionCardButtonClicked" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionConfigurationQuerySettingUrl" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionConfigurationSetting" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionFetchTask" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionQuery" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionSelectItem" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionSubmitAction" - }, - { - "$ref": "#/definitions/Teams.OnO365ConnectorCardAction" - }, - { - "$ref": "#/definitions/Teams.OnTaskModuleFetch" - }, - { - "$ref": "#/definitions/Teams.OnTaskModuleSubmit" - }, - { - "$ref": "#/definitions/Teams.OnTeamArchived" - }, - { - "$ref": "#/definitions/Teams.OnTeamDeleted" - }, - { - "$ref": "#/definitions/Teams.OnTeamHardDeleted" - }, - { - "$ref": "#/definitions/Teams.OnTeamRenamed" - }, - { - "$ref": "#/definitions/Teams.OnTeamRestored" - }, - { - "$ref": "#/definitions/Teams.OnTeamUnarchived" - }, - { - "$ref": "#/definitions/Testbot.JavascriptAction" - }, - { - "$ref": "#/definitions/Testbot.Multiply" - } - ], - "definitions": { - "AzureQueues.ContinueConversationLater": { - "$role": "implements(Microsoft.IDialog)", - "title": "Continue Conversation Later (Queue)", - "description": "Continue conversation at later time (via Azure Storage Queue).", - "type": "object", - "required": [ - "date", - "connectionString", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "date": { - "$ref": "#/definitions/stringExpression", - "title": "Date", - "description": "Date in the future as a ISO string when the conversation should continue.", - "examples": [ - "=addHours(utcNow(), 1)" - ] - }, - "connectionString": { - "$ref": "#/definitions/stringExpression", - "title": "Connection String", - "description": "Connection string for connecting to an Azure Storage account.", - "examples": [ - "=settings.connectionString" - ] - }, - "queueName": { - "$ref": "#/definitions/stringExpression", - "title": "Queue Name", - "description": "Name of the queue that your azure function is bound to.", - "examples": [ - "activities" - ], - "default": "activities" - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "Value to send in the activity.value." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "AzureQueues.ContinueConversationLater" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "CustomAction.dialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "Custom Action", - "description": "My Custom Action.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "age": { - "$ref": "#/definitions/numberExpression", - "title": "Age", - "description": "The age.", - "examples": [ - 20, - "=$foo" - ] - }, - "name": { - "$ref": "#/definitions/stringExpression", - "title": "Name", - "description": "The name." - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store any value returned by the dialog that is called.", - "examples": [ - "$name" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "CustomAction.dialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "CustomAction2.dialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "Custom Action", - "description": "My Custom Action.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "age": { - "$ref": "#/definitions/numberExpression", - "title": "Age", - "description": "The age.", - "examples": [ - 20, - "=$foo" - ] - }, - "name": { - "$ref": "#/definitions/stringExpression", - "title": "Name", - "description": "The name." - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store any value returned by the dialog that is called.", - "examples": [ - "$name" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "CustomAction2.dialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ActivityTemplate": { - "$role": "implements(Microsoft.IActivityTemplate)", - "title": "Microsoft ActivityTemplate", - "type": "object", - "required": [ - "template", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "template": { - "title": "Template", - "description": "Language Generator template to use to create the activity", - "type": "string" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ActivityTemplate" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.AdaptiveDialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "Adaptive Dialog", - "description": "Flexible, data driven dialog that can adapt to the conversation.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional dialog ID." - }, - "autoEndDialog": { - "$ref": "#/definitions/booleanExpression", - "title": "Auto end dialog", - "description": "If set to true the dialog will automatically end when there are no further actions. If set to false, remember to manually end the dialog using EndDialog action.", - "default": true - }, - "defaultResultProperty": { - "type": "string", - "title": "Default result property", - "description": "Value that will be passed back to the parent dialog.", - "default": "dialog.result" - }, - "recognizer": { - "$kind": "Microsoft.IRecognizer", - "title": "Recognizer", - "description": "Input recognizer that interprets user input into intent and entities.", - "$ref": "#/definitions/Microsoft.IRecognizer" - }, - "generator": { - "$kind": "Microsoft.ILanguageGenerator", - "title": "Language Generator", - "description": "Language generator that generates bot responses.", - "$ref": "#/definitions/Microsoft.ILanguageGenerator" - }, - "selector": { - "$kind": "Microsoft.ITriggerSelector", - "title": "Selector", - "description": "Policy to determine which trigger is executed. Defaults to a 'best match' selector (optional).", - "$ref": "#/definitions/Microsoft.ITriggerSelector" - }, - "triggers": { - "type": "array", - "description": "List of triggers defined for this dialog.", - "title": "Triggers", - "items": { - "$kind": "Microsoft.ITrigger", - "title": "Event triggers", - "description": "Event triggers for handling events.", - "$ref": "#/definitions/Microsoft.ITrigger" - } - }, - "schema": { - "title": "Schema", - "description": "Schema to fill in.", - "anyOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "type": "string", - "title": "Reference to JSON schema", - "description": "Reference to JSON schema .dialog file." - } - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.AdaptiveDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.AgeEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Age Entity Recognizer", - "description": "Recognizer which recognizes age.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.AgeEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Ask": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.SendActivity)" - ], - "title": "Send Activity to Ask a question", - "description": "This is an action which sends an activity to the user when a response is expected", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "expectedProperties": { - "$ref": "#/definitions/arrayExpression", - "title": "Expected Properties", - "description": "Properties expected from the user.", - "examples": [ - [ - "age", - "name" - ] - ], - "items": { - "type": "string", - "title": "Name", - "description": "Name of the property" - } - }, - "defaultOperation": { - "$ref": "#/definitions/stringExpression", - "title": "Default Operation", - "description": "Sets the default operation that will be used when no operation is recognized in the response to this Ask.", - "examples": [ - "Add()", - "Remove()" - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/stringExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "activity": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Activity", - "description": "Activity to send.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Ask" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.AttachmentInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Attachment input dialog", - "description": "Collect information - Ask for a file or image.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "defaultValue": { - "$role": "expression", - "title": "Default value", - "description": "'Property' will be set to the object or the result of this expression when max turn count is exceeded.", - "oneOf": [ - { - "$ref": "#/definitions/botframework.json/definitions/Attachment", - "title": "Object", - "description": "Attachment object." - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "value": { - "$role": "expression", - "title": "Value", - "description": "'Property' will be set to the object or the result of this expression unless it evaluates to null.", - "oneOf": [ - { - "$ref": "#/definitions/botframework.json/definitions/Attachment", - "title": "Object", - "description": "Attachment object." - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "outputFormat": { - "$role": "expression", - "title": "Output format", - "description": "Attachment output format.", - "oneOf": [ - { - "type": "string", - "title": "Standard format", - "description": "Standard output formats.", - "enum": [ - "all", - "first" - ], - "default": "first" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.AttachmentInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.BeginDialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "Begin a dialog", - "description": "Begin another dialog.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "dialog": { - "oneOf": [ - { - "$kind": "Microsoft.IDialog", - "pattern": "^(?!(=)).*", - "title": "Dialog", - "$ref": "#/definitions/Microsoft.IDialog" - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=settings.dialogId" - ] - } - ], - "title": "Dialog name", - "description": "Name of the dialog to call." - }, - "options": { - "$ref": "#/definitions/objectExpression", - "title": "Options", - "description": "One or more options that are passed to the dialog that is called.", - "examples": [ - { - "arg1": "=expression" - } - ], - "additionalProperties": { - "type": "string", - "title": "Options", - "description": "Options for dialog." - } - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity Processed", - "description": "When set to false, the dialog that is called can process the current activity.", - "default": true - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store any value returned by the dialog that is called.", - "examples": [ - "dialog.userName" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.BeginDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.BeginSkill": { - "$role": "implements(Microsoft.IDialog)", - "title": "Begin a skill", - "description": "Begin a remote skill.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the skill dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=f(x)" - ] - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity Processed", - "description": "When set to false, the skill will be started using the activity in the current turn context instead of the activity in the Activity property.", - "default": true, - "examples": [ - true, - "=f(x)" - ] - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store any value returned by the dialog that is called.", - "examples": [ - "dialog.userName" - ] - }, - "botId": { - "$ref": "#/definitions/stringExpression", - "title": "Skill host bot ID", - "description": "The Microsoft App ID that will be calling the skill.", - "default": "=settings.MicrosoftAppId" - }, - "skillHostEndpoint": { - "$ref": "#/definitions/stringExpression", - "title": "Skill host", - "description": "The callback Url for the skill host.", - "default": "=settings.skillHostEndpoint", - "examples": [ - "https://mybot.contoso.com/api/skills/" - ] - }, - "connectionName": { - "$ref": "#/definitions/stringExpression", - "title": "OAuth Connection Name (SSO)", - "description": "The OAuth Connection Name, that would be used to perform Single SignOn with a skill.", - "default": "=settings.connectionName" - }, - "skillAppId": { - "$ref": "#/definitions/stringExpression", - "title": "Skill App ID", - "description": "The Microsoft App ID for the skill." - }, - "skillEndpoint": { - "$ref": "#/definitions/stringExpression", - "title": "Skill endpoint ", - "description": "The /api/messages endpoint for the skill.", - "examples": [ - "https://myskill.contoso.com/api/messages/" - ] - }, - "activity": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Activity", - "description": "The activity to send to the skill.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the skill.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.BeginSkill" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.BreakLoop": { - "$role": "implements(Microsoft.IDialog)", - "title": "Break Loop", - "description": "Stop executing this loop", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.BreakLoop" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.CancelAllDialogs": { - "$role": "implements(Microsoft.IDialog)", - "title": "Cancel all dialogs", - "description": "Cancel all active dialogs. All dialogs in the dialog chain will need a trigger to capture the event configured in this action.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity Processed", - "description": "When set to false, the caller dialog is told it should process the current activity.", - "default": true - }, - "eventName": { - "$ref": "#/definitions/stringExpression", - "title": "Event name", - "description": "Name of the event to emit." - }, - "eventValue": { - "$ref": "#/definitions/valueExpression", - "title": "Event value", - "description": "Value to emit with the event (optional).", - "additionalProperties": true - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.CancelAllDialogs" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.CancelDialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "Cancel all dialogs", - "description": "Cancel all active dialogs. All dialogs in the dialog chain will need a trigger to capture the event configured in this action.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity Processed", - "description": "When set to false, the caller dialog is told it should process the current activity.", - "default": true - }, - "eventName": { - "$ref": "#/definitions/stringExpression", - "title": "Event name", - "description": "Name of the event to emit." - }, - "eventValue": { - "$ref": "#/definitions/valueExpression", - "title": "Event value", - "description": "Value to emit with the event (optional).", - "additionalProperties": true - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.CancelDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ChoiceInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Choice input dialog", - "description": "Collect information - Pick from a list of choices", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "defaultValue": { - "$ref": "#/definitions/stringExpression", - "title": "Default value", - "description": "'Property' will be set to the value of this expression when max turn count is exceeded.", - "examples": [ - "hello world", - "Hello ${user.name}", - "=concat(user.firstname, user.lastName)" - ] - }, - "value": { - "$ref": "#/definitions/stringExpression", - "title": "Value", - "description": "'Property' will be set to the value of this expression unless it evaluates to null.", - "examples": [ - "hello world", - "Hello ${user.name}", - "=concat(user.firstname, user.lastName)" - ] - }, - "outputFormat": { - "$role": "expression", - "title": "Output format", - "description": "Sets the desired choice output format (either value or index into choices).", - "oneOf": [ - { - "type": "string", - "title": "Standard", - "description": "Standard output format.", - "enum": [ - "value", - "index" - ], - "default": "value" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "choices": { - "$role": "expression", - "title": "Array of choices", - "description": "Choices to choose from.", - "oneOf": [ - { - "type": "array", - "title": "Simple choices", - "description": "Simple choices to choose from.", - "items": [ - { - "type": "string", - "title": "Simple choice", - "description": "One choice for choice input." - } - ] - }, - { - "type": "array", - "title": "Structured choices", - "description": "Choices that allow full control.", - "items": [ - { - "type": "object", - "title": "Structured choice", - "description": "Structured choice to choose from.", - "properties": { - "value": { - "type": "string", - "title": "Value", - "description": "Value to return when this choice is selected." - }, - "action": { - "$ref": "#/definitions/botframework.json/definitions/CardAction", - "title": "Action", - "description": "Card action for the choice." - }, - "synonyms": { - "type": "array", - "title": "Synonyms", - "description": "List of synonyms to recognize in addition to the value (optional).", - "items": { - "type": "string", - "title": "Synonym", - "description": "Synonym for value." - } - } - } - } - ] - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "defaultLocale": { - "$ref": "#/definitions/stringExpression", - "title": "Default locale", - "description": "The default locale to use to parse confirmation choices if there is not one passed by the caller.", - "default": "en-us", - "examples": [ - "en-us" - ] - }, - "style": { - "$role": "expression", - "title": "List style", - "description": "Sets the ListStyle to control how choices are rendered.", - "oneOf": [ - { - "type": "string", - "title": "List style", - "description": "Standard list style.", - "enum": [ - "none", - "auto", - "inline", - "list", - "suggestedAction", - "heroCard" - ], - "default": "auto" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "choiceOptions": { - "title": "Choice options", - "description": "Sets the choice options used for controlling how choices are combined.", - "oneOf": [ - { - "type": "object", - "title": "Object", - "description": "Choice options object.", - "properties": { - "inlineSeparator": { - "type": "string", - "title": "Inline separator", - "description": "Character used to separate individual choices when there are more than 2 choices", - "default": ", " - }, - "inlineOr": { - "type": "string", - "title": "Inline or", - "description": "Separator inserted between the choices when there are only 2 choices", - "default": " or " - }, - "inlineOrMore": { - "type": "string", - "title": "Inline or more", - "description": "Separator inserted between the last 2 choices when their are more than 2 choices.", - "default": ", or " - }, - "includeNumbers": { - "type": "boolean", - "title": "Include numbers", - "description": "If true, 'inline' and 'list' list style will be prefixed with the index of the choice.", - "default": true - } - } - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "recognizerOptions": { - "title": "Recognizer options", - "description": "Sets how to recognize choices in the response", - "oneOf": [ - { - "type": "object", - "title": "Object", - "description": "Options for recognizer.", - "properties": { - "noValue": { - "type": "boolean", - "title": "No value", - "description": "If true, the choices value field will NOT be search over", - "default": false - }, - "noAction": { - "type": "boolean", - "title": "No action", - "description": "If true, the choices action.title field will NOT be searched over", - "default": false - }, - "recognizeNumbers": { - "type": "boolean", - "title": "Recognize numbers", - "description": "If true, the number recognizer will be used to recognize an index response (1,2,3...) to the prompt.", - "default": true - }, - "recognizeOrdinals": { - "type": "boolean", - "title": "Recognize ordinals", - "description": "If true, the ordinal recognizer will be used to recognize ordinal response (first/second/...) to the prompt.", - "default": true - } - } - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ChoiceInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ConditionalSelector": { - "$role": "implements(Microsoft.ITriggerSelector)", - "title": "Conditional Trigger Selector", - "description": "Use a rule selector based on a condition", - "type": "object", - "required": [ - "condition", - "ifTrue", - "ifFalse", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression to evaluate" - }, - "ifTrue": { - "$kind": "Microsoft.ITriggerSelector", - "$ref": "#/definitions/Microsoft.ITriggerSelector" - }, - "ifFalse": { - "$kind": "Microsoft.ITriggerSelector", - "$ref": "#/definitions/Microsoft.ITriggerSelector" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ConditionalSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ConfirmInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Confirm input dialog", - "description": "Collect information - Ask for confirmation (yes or no).", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "outputFormat": { - "$ref": "#/definitions/valueExpression", - "title": "Output format", - "description": "Optional expression to use to format the output.", - "examples": [ - "=concat('confirmation:', this.value)" - ] - }, - "defaultLocale": { - "$ref": "#/definitions/stringExpression", - "title": "Default locale", - "description": "The Default locale or an expression which provides the default locale to use as default if not found in the activity.", - "default": "en-us", - "examples": [ - "en-us" - ] - }, - "style": { - "$role": "expression", - "title": "List style", - "description": "Sets the ListStyle to control how choices are rendered.", - "oneOf": [ - { - "type": "string", - "title": "Standard style", - "description": "Standard style for rendering choices.", - "enum": [ - "none", - "auto", - "inline", - "list", - "suggestedAction", - "heroCard" - ], - "default": "auto" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "choiceOptions": { - "title": "Choice Options", - "description": "Choice Options or expression which provides Choice Options to control display choices to the user.", - "oneOf": [ - { - "type": "object", - "title": "Choice options", - "description": "Choice options.", - "properties": { - "inlineSeparator": { - "type": "string", - "title": "Inline separator", - "description": "Text to separate individual choices when there are more than 2 choices", - "default": ", " - }, - "inlineOr": { - "type": "string", - "title": "Inline or", - "description": "Text to be inserted between the choices when their are only 2 choices", - "default": " or " - }, - "inlineOrMore": { - "type": "string", - "title": "Inline or more", - "description": "Text to be inserted between the last 2 choices when their are more than 2 choices.", - "default": ", or " - }, - "includeNumbers": { - "type": "boolean", - "title": "Include numbers", - "description": "If true, inline and list style choices will be prefixed with the index of the choice.", - "default": true - } - } - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "defaultValue": { - "$ref": "#/definitions/booleanExpression", - "title": "Default value", - "description": "'Property' will be set to the value of this expression when max turn count is exceeded.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "value": { - "$ref": "#/definitions/booleanExpression", - "title": "Value", - "description": "'Property' will be set to the value of this expression unless it evaluates to null.", - "examples": [ - true, - "=user.isVip" - ] - }, - "confirmChoices": { - "$role": "expression", - "title": "Array of choice objects", - "description": "Array of simple or structured choices.", - "oneOf": [ - { - "type": "array", - "title": "Simple choices", - "description": "Simple choices to confirm from.", - "items": [ - { - "type": "string", - "title": "Simple choice", - "description": "Simple choice to confirm." - } - ] - }, - { - "type": "array", - "title": "Structured choices", - "description": "Structured choices for confirmations.", - "items": [ - { - "type": "object", - "title": "Choice", - "description": "Choice to confirm.", - "properties": { - "value": { - "type": "string", - "title": "Value", - "description": "Value to return when this choice is selected." - }, - "action": { - "$ref": "#/definitions/botframework.json/definitions/CardAction", - "title": "Action", - "description": "Card action for the choice." - }, - "synonyms": { - "type": "array", - "title": "Synonyms", - "description": "List of synonyms to recognize in addition to the value (optional).", - "items": { - "type": "string", - "title": "Synonym", - "description": "Synonym for choice." - } - } - } - } - ] - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ConfirmInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ConfirmationEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Confirmation Entity Recognizer", - "description": "Recognizer which recognizes confirmation choices (yes/no).", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ConfirmationEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ContinueLoop": { - "$role": "implements(Microsoft.IDialog)", - "title": "Continue Loop", - "description": "Stop executing this template and continue with the next iteration of the loop.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ContinueLoop" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.CrossTrainedRecognizerSet": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "Cross-trained Recognizer Set", - "description": "Recognizer for selecting between cross trained recognizers.", - "type": "object", - "required": [ - "recognizers", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet." - }, - "recognizers": { - "type": "array", - "title": "Recognizers", - "description": "List of Recognizers defined for this set.", - "items": { - "$kind": "Microsoft.IRecognizer", - "$ref": "#/definitions/Microsoft.IRecognizer" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.CrossTrainedRecognizerSet" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.CurrencyEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Currency Entity Recognizer", - "description": "Recognizer which recognizes currency.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.CurrencyEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DateTimeEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "DateTime Entity Recognizer", - "description": "Recognizer which recognizes dates and time fragments.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DateTimeEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DateTimeInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Date/time input dialog", - "description": "Collect information - Ask for date and/ or time", - "type": "object", - "defaultLocale": { - "$ref": "#/definitions/stringExpression", - "title": "Default locale", - "description": "Default locale.", - "default": "en-us" - }, - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "defaultValue": { - "$ref": "#/definitions/stringExpression", - "format": "date-time", - "title": "Default Date", - "description": "'Property' will be set to the value or the result of the expression when max turn count is exceeded.", - "examples": [ - "=user.birthday" - ] - }, - "value": { - "$ref": "#/definitions/stringExpression", - "format": "date-time", - "title": "Value", - "description": "'Property' will be set to the value or the result of the expression unless it evaluates to null.", - "examples": [ - "=user.birthday" - ] - }, - "outputFormat": { - "$ref": "#/definitions/expression", - "title": "Output format", - "description": "Expression to use for formatting the output.", - "examples": [ - "=this.value[0].Value" - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DateTimeInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DebugBreak": { - "$role": "implements(Microsoft.IDialog)", - "title": "Debugger break", - "description": "If debugger is attached, stop the execution at this point in the conversation.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DebugBreak" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DeleteActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Delete Activity", - "description": "Delete an activity that was previously sent.", - "type": "object", - "required": [ - "activityId", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "activityId": { - "$ref": "#/definitions/stringExpression", - "title": "ActivityId", - "description": "expression to an activityId to delete", - "examples": [ - "=$lastActivity" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DeleteActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DeleteProperties": { - "$role": "implements(Microsoft.IDialog)", - "title": "Delete Properties", - "description": "Delete multiple properties and any value it holds.", - "type": "object", - "required": [ - "properties", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "properties": { - "type": "array", - "title": "Properties", - "description": "Properties to delete.", - "items": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to delete." - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DeleteProperties" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DeleteProperty": { - "$role": "implements(Microsoft.IDialog)", - "title": "Delete Property", - "description": "Delete a property and any value it holds.", - "type": "object", - "required": [ - "property", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to delete." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DeleteProperty" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.DimensionEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Dimension Entity Recognizer", - "description": "Recognizer which recognizes dimension.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.DimensionEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EditActions": { - "$role": "implements(Microsoft.IDialog)", - "title": "Edit actions.", - "description": "Edit the current list of actions.", - "type": "object", - "required": [ - "changeType", - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "changeType": { - "title": "Type of change", - "description": "Type of change to apply to the current actions.", - "oneOf": [ - { - "type": "string", - "title": "Standard change", - "description": "Standard change types.", - "enum": [ - "insertActions", - "insertActionsBeforeTags", - "appendActions", - "endSequence", - "replaceSequence" - ] - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Actions to apply.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EditActions" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EditArray": { - "$role": "implements(Microsoft.IDialog)", - "title": "Edit array", - "description": "Modify an array in memory", - "type": "object", - "required": [ - "itemsProperty", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "changeType": { - "title": "Type of change", - "description": "Type of change to the array in memory.", - "oneOf": [ - { - "type": "string", - "title": "Enum", - "description": "Standard change type.", - "enum": [ - "push", - "pop", - "take", - "remove", - "clear" - ] - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "itemsProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Items property", - "description": "Property that holds the array to update." - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Result Property", - "description": "Property to store the result of this action." - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "New value or expression.", - "examples": [ - "milk", - "=dialog.favColor", - "=dialog.favColor == 'red'" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EditArray" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EmailEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Email Entity Recognizer", - "description": "Recognizer which recognizes email.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EmailEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EmitEvent": { - "$role": "implements(Microsoft.IDialog)", - "title": "Emit a custom event", - "description": "Emit an event. Capture this event with a trigger.", - "type": "object", - "required": [ - "eventName", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "eventName": { - "$role": "expression", - "title": "Event name", - "description": "Name of the event to emit.", - "oneOf": [ - { - "type": "string", - "title": "Built-in event", - "description": "Standard event type.", - "enum": [ - "beginDialog", - "resumeDialog", - "repromptDialog", - "cancelDialog", - "endDialog", - "activityReceived", - "recognizedIntent", - "unknownIntent", - "actionsStarted", - "actionsSaved", - "actionsEnded", - "actionsResumed" - ] - }, - { - "type": "string", - "title": "Custom event", - "description": "Custom event type", - "pattern": "^(?!(beginDialog$|resumeDialog$|repromptDialog$|cancelDialog$|endDialog$|activityReceived$|recognizedIntent$|unknownIntent$|actionsStarted$|actionsSaved$|actionsEnded$|actionsResumed))(\\S){1}.*" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "eventValue": { - "$ref": "#/definitions/valueExpression", - "title": "Event value", - "description": "Value to emit with the event (optional)." - }, - "bubbleEvent": { - "$ref": "#/definitions/booleanExpression", - "title": "Bubble event", - "description": "If true this event is passed on to parent dialogs." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EmitEvent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EndDialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "End dialog", - "description": "End this dialog.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "Result value returned to the parent dialog.", - "examples": [ - "=dialog.userName", - "='tomato'" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EndDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.EndTurn": { - "$role": "implements(Microsoft.IDialog)", - "title": "End turn", - "description": "End the current turn without ending the dialog.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.EndTurn" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.FirstSelector": { - "$role": "implements(Microsoft.ITriggerSelector)", - "title": "First Trigger Selector", - "description": "Selector for first true rule", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.FirstSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Foreach": { - "$role": "implements(Microsoft.IDialog)", - "title": "For each item", - "description": "Execute actions on each item in an a collection.", - "type": "object", - "required": [ - "itemsProperty", - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "itemsProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Items property", - "description": "Property that holds the array.", - "examples": [ - "user.todoList" - ] - }, - "index": { - "$ref": "#/definitions/stringExpression", - "title": "Index property", - "description": "Property that holds the index of the item.", - "default": "dialog.foreach.index" - }, - "value": { - "$ref": "#/definitions/stringExpression", - "title": "Value property", - "description": "Property that holds the value of the item.", - "default": "dialog.foreach.value" - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Actions to execute for each item. Use '$foreach.value' to access the value of each item. Use '$foreach.index' to access the index of each item.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Foreach" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ForeachPage": { - "$role": "implements(Microsoft.IDialog)", - "title": "For each page", - "description": "Execute actions on each page (collection of items) in an array.", - "type": "object", - "required": [ - "itemsProperty", - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "itemsProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Items property", - "description": "Property that holds the array.", - "examples": [ - "user.todoList" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Actions to execute for each page. Use '$foreach.page' to access each page.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "pageIndex": { - "$ref": "#/definitions/stringExpression", - "title": "Index property", - "description": "Property that holds the index of the page.", - "default": "dialog.foreach.pageindex" - }, - "page": { - "$ref": "#/definitions/stringExpression", - "title": "Page property", - "description": "Property that holds the value of the page.", - "default": "dialog.foreach.page" - }, - "pageSize": { - "$ref": "#/definitions/integerExpression", - "title": "Page size", - "description": "Number of items in each page.", - "default": 10 - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ForeachPage" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.GetActivityMembers": { - "$role": "implements(Microsoft.IDialog)", - "title": "Get Activity Members", - "description": "Get the members who are participating in an activity. (BotFrameworkAdapter only)", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property (named location to store information).", - "examples": [ - "user.age" - ] - }, - "activityId": { - "$ref": "#/definitions/stringExpression", - "title": "ActivityId", - "description": "Activity ID or expression to an activityId to use to get the members. If none is defined then the current activity id will be used.", - "examples": [ - "$lastActivity" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.GetActivityMembers" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.GetConversationMembers": { - "$role": "implements(Microsoft.IDialog)", - "title": "Get Converation Members", - "description": "Get the members who are participating in an conversation. (BotFrameworkAdapter only)", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property (named location to store information).", - "examples": [ - "user.age" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.GetConversationMembers" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.GotoAction": { - "$role": "implements(Microsoft.IDialog)", - "title": "Go to Action", - "description": "Go to an an action by id.", - "type": "object", - "required": [ - "actionId", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "actionId": { - "$ref": "#/definitions/stringExpression", - "title": "Action Id", - "description": "Action Id to execute next" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.GotoAction" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.GuidEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Guid Entity Recognizer", - "description": "Recognizer which recognizes guids.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.GuidEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.HashtagEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Hashtag Entity Recognizer", - "description": "Recognizer which recognizes Hashtags.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.HashtagEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.HttpRequest": { - "$role": "implements(Microsoft.IDialog)", - "type": "object", - "title": "HTTP request", - "description": "Make a HTTP request.", - "required": [ - "url", - "method", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "method": { - "type": "string", - "title": "HTTP method", - "description": "HTTP method to use.", - "enum": [ - "GET", - "POST", - "PATCH", - "PUT", - "DELETE" - ], - "examples": [ - "GET", - "POST" - ] - }, - "url": { - "$ref": "#/definitions/stringExpression", - "title": "Url", - "description": "URL to call (supports data binding).", - "examples": [ - "https://contoso.com" - ] - }, - "body": { - "$ref": "#/definitions/valueExpression", - "title": "Body", - "description": "Body to include in the HTTP call (supports data binding).", - "additionalProperties": true - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Result property", - "description": "A property to store the result of this action. The result can include any of the 4 properties from the HTTP response: statusCode, reasonPhrase, content, and headers. If the content is JSON it will be a deserialized object. The values can be accessed via .content for example.", - "examples": [ - "dialog.contosodata" - ] - }, - "contentType": { - "$ref": "#/definitions/stringExpression", - "title": "Content type", - "description": "Content media type for the body.", - "examples": [ - "application/json", - "text/plain" - ] - }, - "headers": { - "type": "object", - "title": "Headers", - "description": "One or more headers to include in the request (supports data binding).", - "additionalProperties": { - "$ref": "#/definitions/stringExpression" - } - }, - "responseType": { - "$ref": "#/definitions/stringExpression", - "title": "Response type", - "description": "Defines the type of HTTP response. Automatically calls the 'Send a response' action if set to 'Activity' or 'Activities'.", - "oneOf": [ - { - "type": "string", - "title": "Standard response", - "description": "Standard response type.", - "enum": [ - "none", - "json", - "activity", - "activities", - "binary" - ], - "default": "json" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.HttpRequest" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.IActivityTemplate": { - "title": "Microsoft ActivityTemplates", - "description": "Components which are ActivityTemplate, which is string template, an activity, or a implementation of ActivityTemplate", - "$role": "interface", - "oneOf": [ - { - "type": "string" - }, - { - "$ref": "#/definitions/botframework.json/definitions/Activity", - "required": [ - "type" - ] - }, - { - "$ref": "#/definitions/Microsoft.ActivityTemplate" - }, - { - "$ref": "#/definitions/Microsoft.StaticActivityTemplate" - } - ] - }, - "Microsoft.IDialog": { - "title": "Microsoft Dialogs", - "description": "Components which derive from Dialog", - "$role": "interface", - "oneOf": [ - { - "type": "string" - }, - { - "$ref": "#/definitions/Microsoft.QnAMakerDialog" - }, - { - "$ref": "#/definitions/AzureQueues.ContinueConversationLater" - }, - { - "$ref": "#/definitions/Microsoft.AdaptiveDialog" - }, - { - "$ref": "#/definitions/Microsoft.Test.AssertCondition" - }, - { - "$ref": "#/definitions/Microsoft.Ask" - }, - { - "$ref": "#/definitions/Microsoft.AttachmentInput" - }, - { - "$ref": "#/definitions/Microsoft.ChoiceInput" - }, - { - "$ref": "#/definitions/Microsoft.ConfirmInput" - }, - { - "$ref": "#/definitions/Microsoft.DateTimeInput" - }, - { - "$ref": "#/definitions/Microsoft.NumberInput" - }, - { - "$ref": "#/definitions/Microsoft.OAuthInput" - }, - { - "$ref": "#/definitions/Microsoft.TextInput" - }, - { - "$ref": "#/definitions/Microsoft.BeginDialog" - }, - { - "$ref": "#/definitions/Microsoft.BeginSkill" - }, - { - "$ref": "#/definitions/Microsoft.BreakLoop" - }, - { - "$ref": "#/definitions/Microsoft.CancelAllDialogs" - }, - { - "$ref": "#/definitions/Microsoft.CancelDialog" - }, - { - "$ref": "#/definitions/Microsoft.ContinueLoop" - }, - { - "$ref": "#/definitions/Microsoft.DebugBreak" - }, - { - "$ref": "#/definitions/Microsoft.DeleteActivity" - }, - { - "$ref": "#/definitions/Microsoft.DeleteProperties" - }, - { - "$ref": "#/definitions/Microsoft.DeleteProperty" - }, - { - "$ref": "#/definitions/Microsoft.EditActions" - }, - { - "$ref": "#/definitions/Microsoft.EditArray" - }, - { - "$ref": "#/definitions/Microsoft.EmitEvent" - }, - { - "$ref": "#/definitions/Microsoft.EndDialog" - }, - { - "$ref": "#/definitions/Microsoft.EndTurn" - }, - { - "$ref": "#/definitions/Microsoft.Foreach" - }, - { - "$ref": "#/definitions/Microsoft.ForeachPage" - }, - { - "$ref": "#/definitions/Microsoft.GetActivityMembers" - }, - { - "$ref": "#/definitions/Microsoft.GetConversationMembers" - }, - { - "$ref": "#/definitions/Microsoft.GotoAction" - }, - { - "$ref": "#/definitions/Microsoft.HttpRequest" - }, - { - "$ref": "#/definitions/Microsoft.IfCondition" - }, - { - "$ref": "#/definitions/Microsoft.LogAction" - }, - { - "$ref": "#/definitions/Microsoft.RepeatDialog" - }, - { - "$ref": "#/definitions/Microsoft.ReplaceDialog" - }, - { - "$ref": "#/definitions/Microsoft.SendActivity" - }, - { - "$ref": "#/definitions/Microsoft.SetProperties" - }, - { - "$ref": "#/definitions/Microsoft.SetProperty" - }, - { - "$ref": "#/definitions/Microsoft.SignOutUser" - }, - { - "$ref": "#/definitions/Microsoft.SwitchCondition" - }, - { - "$ref": "#/definitions/Microsoft.TelemetryTrackEvent" - }, - { - "$ref": "#/definitions/Microsoft.TraceActivity" - }, - { - "$ref": "#/definitions/Microsoft.UpdateActivity" - }, - { - "$ref": "#/definitions/Testbot.JavascriptAction" - }, - { - "$ref": "#/definitions/Testbot.Multiply" - }, - { - "$ref": "#/definitions/CustomAction.dialog" - }, - { - "$ref": "#/definitions/CustomAction2.dialog" - } - ] - }, - "Microsoft.IEntityRecognizer": { - "$role": "interface", - "title": "Entity Recognizers", - "description": "Components which derive from EntityRecognizer.", - "type": "object", - "oneOf": [ - { - "type": "string", - "title": "Reference to Microsoft.IEntityRecognizer", - "description": "Reference to Microsoft.IEntityRecognizer .dialog file." - }, - { - "$ref": "#/definitions/Microsoft.AgeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.ConfirmationEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.CurrencyEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.DateTimeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.DimensionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.EmailEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.GuidEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.HashtagEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.IpEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.MentionEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.NumberEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.NumberRangeEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.OrdinalEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.PercentageEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.PhoneNumberEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RegexEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.TemperatureEntityRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.UrlEntityRecognizer" - } - ] - }, - "Microsoft.ILanguageGenerator": { - "title": "Microsoft LanguageGenerator", - "description": "Components which dervie from the LanguageGenerator class", - "$role": "interface", - "oneOf": [ - { - "type": "string" - }, - { - "$ref": "#/definitions/Microsoft.ResourceMultiLanguageGenerator" - }, - { - "$ref": "#/definitions/Microsoft.TemplateEngineLanguageGenerator" - } - ] - }, - "Microsoft.IRecognizer": { - "title": "Microsoft Recognizer", - "description": "Components which derive from Recognizer class", - "$role": "interface", - "oneOf": [ - { - "type": "string" - }, - { - "$ref": "#/definitions/Microsoft.OrchestratorRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.LuisRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.QnAMakerRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.CrossTrainedRecognizerSet" - }, - { - "$ref": "#/definitions/Microsoft.MultiLanguageRecognizer" - }, - { - "$ref": "#/definitions/Microsoft.RecognizerSet" - }, - { - "$ref": "#/definitions/Microsoft.RegexRecognizer" - } - ] - }, - "Microsoft.ITextTemplate": { - "title": "Microsoft TextTemplate", - "description": "Components which derive from TextTemplate class", - "$role": "interface", - "oneOf": [ - { - "type": "string" - }, - { - "$ref": "#/definitions/Microsoft.TextTemplate" - } - ] - }, - "Microsoft.ITrigger": { - "$role": "interface", - "title": "Microsoft Triggers", - "description": "Components which derive from OnCondition class.", - "oneOf": [ - { - "type": "string", - "title": "Reference to Microsoft.ITrigger", - "description": "Reference to Microsoft.ITrigger .dialog file." - }, - { - "$ref": "#/definitions/Microsoft.OnActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnAssignEntity" - }, - { - "$ref": "#/definitions/Microsoft.OnBeginDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnCancelDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseEntity" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseIntent" - }, - { - "$ref": "#/definitions/Microsoft.OnChooseProperty" - }, - { - "$ref": "#/definitions/Microsoft.OnCondition" - }, - { - "$ref": "#/definitions/Microsoft.OnContinueConversation" - }, - { - "$ref": "#/definitions/Microsoft.OnConversationUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnDialogEvent" - }, - { - "$ref": "#/definitions/Microsoft.OnEndOfActions" - }, - { - "$ref": "#/definitions/Microsoft.OnEndOfConversationActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnError" - }, - { - "$ref": "#/definitions/Microsoft.OnEventActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnHandoffActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnInstallationUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnIntent" - }, - { - "$ref": "#/definitions/Microsoft.OnInvokeActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageDeleteActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageReactionActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnMessageUpdateActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnQnAMatch" - }, - { - "$ref": "#/definitions/Microsoft.OnRepromptDialog" - }, - { - "$ref": "#/definitions/Microsoft.OnTypingActivity" - }, - { - "$ref": "#/definitions/Microsoft.OnUnknownIntent" - }, - { - "$ref": "#/definitions/Teams.OnAppBasedLinkQuery" - }, - { - "$ref": "#/definitions/Teams.OnCardAction" - }, - { - "$ref": "#/definitions/Teams.OnChannelCreated" - }, - { - "$ref": "#/definitions/Teams.OnChannelDeleted" - }, - { - "$ref": "#/definitions/Teams.OnChannelRenamed" - }, - { - "$ref": "#/definitions/Teams.OnChannelRestored" - }, - { - "$ref": "#/definitions/Teams.OnFileConsent" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionCardButtonClicked" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionConfigurationQuerySettingUrl" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionConfigurationSetting" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionFetchTask" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionQuery" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionSelectItem" - }, - { - "$ref": "#/definitions/Teams.OnMessagingExtensionSubmitAction" - }, - { - "$ref": "#/definitions/Teams.OnO365ConnectorCardAction" - }, - { - "$ref": "#/definitions/Teams.OnTaskModuleFetch" - }, - { - "$ref": "#/definitions/Teams.OnTaskModuleSubmit" - }, - { - "$ref": "#/definitions/Teams.OnTeamArchived" - }, - { - "$ref": "#/definitions/Teams.OnTeamDeleted" - }, - { - "$ref": "#/definitions/Teams.OnTeamHardDeleted" - }, - { - "$ref": "#/definitions/Teams.OnTeamRenamed" - }, - { - "$ref": "#/definitions/Teams.OnTeamRestored" - }, - { - "$ref": "#/definitions/Teams.OnTeamUnarchived" - } - ] - }, - "Microsoft.ITriggerSelector": { - "$role": "interface", - "title": "Selectors", - "description": "Components which derive from TriggerSelector class.", - "oneOf": [ - { - "type": "string", - "title": "Reference to Microsoft.ITriggerSelector", - "description": "Reference to Microsoft.ITriggerSelector .dialog file." - }, - { - "$ref": "#/definitions/Microsoft.ConditionalSelector" - }, - { - "$ref": "#/definitions/Microsoft.FirstSelector" - }, - { - "$ref": "#/definitions/Microsoft.MostSpecificSelector" - }, - { - "$ref": "#/definitions/Microsoft.RandomSelector" - }, - { - "$ref": "#/definitions/Microsoft.TrueSelector" - } - ] - }, - "Microsoft.IfCondition": { - "$role": "implements(Microsoft.IDialog)", - "title": "If condition", - "description": "Two-way branch the conversation flow based on a condition.", - "type": "object", - "required": [ - "condition", - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression to evaluate.", - "examples": [ - "user.age > 3" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Actions to execute if condition is true.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "elseActions": { - "type": "array", - "title": "Else", - "description": "Actions to execute if condition is false.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.IfCondition" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.InputDialog": { - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.InputDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.IpEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Ip Entity Recognizer", - "description": "Recognizer which recognizes internet IP patterns (like 192.1.1.1).", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.IpEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.LanguagePolicy": { - "title": "Language Policy", - "description": "This represents a policy map for locales lookups to use for language", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": { - "type": "array", - "title": "Per-locale policy", - "description": "Language policy per locale.", - "items": { - "type": "string", - "title": "Locale", - "description": "Locale like en-us." - } - }, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.LanguagePolicy" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.LogAction": { - "$role": "implements(Microsoft.IDialog)", - "title": "Log to console", - "description": "Log a message to the host application. Send a TraceActivity to Bot Framework Emulator (optional).", - "type": "object", - "required": [ - "text", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "text": { - "$ref": "#/definitions/stringExpression", - "title": "Text", - "description": "Information to log." - }, - "label": { - "$ref": "#/definitions/stringExpression", - "title": "Label", - "description": "Label for the trace activity (used to identify it in a list of trace activities.)" - }, - "traceActivity": { - "$ref": "#/definitions/booleanExpression", - "title": "Send Trace Activity", - "description": "If true, automatically sends a TraceActivity (view in Bot Framework Emulator)." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.LogAction" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.LuisRecognizer": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "LUIS Recognizer", - "description": "LUIS recognizer.", - "type": "object", - "required": [ - "applicationId", - "endpoint", - "endpointKey", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet. Other recognizers should return 'DeferToRecognizer_{Id}' intent when cross training data for this recognizer." - }, - "applicationId": { - "$ref": "#/definitions/stringExpression", - "title": "LUIS Application ID", - "description": "Application ID for your model from the LUIS service." - }, - "version": { - "$ref": "#/definitions/stringExpression", - "title": "LUIS Version", - "description": "Optional version to target. If null then predictionOptions.Slot is used." - }, - "endpoint": { - "$ref": "#/definitions/stringExpression", - "title": "LUIS Endpoint", - "description": "Endpoint to use for LUIS service like https://westus.api.cognitive.microsoft.com." - }, - "endpointKey": { - "$ref": "#/definitions/stringExpression", - "title": "LUIS prediction key", - "description": "LUIS prediction key used to call endpoint." - }, - "externalEntityRecognizer": { - "$kind": "Microsoft.IRecognizer", - "title": "External Entity Recognizer", - "description": "Entities recognized by this recognizer will be passed to LUIS as external entities.", - "$ref": "#/definitions/Microsoft.IRecognizer" - }, - "dynamicLists": { - "$ref": "#/definitions/arrayExpression", - "title": "Dynamic lists", - "description": "Runtime defined entity lists.", - "items": { - "title": "Entity list", - "description": "Lists of canonical values and synonyms for an entity.", - "type": "object", - "properties": { - "entity": { - "title": "Entity", - "description": "Entity to extend with a dynamic list.", - "type": "string" - }, - "list": { - "title": "Dynamic list", - "description": "List of canonical forms and synonyms.", - "type": "array", - "items": { - "type": "object", - "title": "List entry", - "description": "Canonical form and synonynms.", - "properties": { - "canonicalForm": { - "title": "Canonical form", - "description": "Resolution if any synonym matches.", - "type": "string" - }, - "synonyms": { - "title": "Synonyms", - "description": "List of synonyms for a canonical form.", - "type": "array", - "items": { - "title": "Synonym", - "description": "Synonym for canonical form.", - "type": "string" - } - } - } - } - } - } - } - }, - "predictionOptions": { - "type": "object", - "title": "Prediction options", - "description": "Options to control LUIS prediction behavior.", - "properties": { - "includeAllIntents": { - "$ref": "#/definitions/booleanExpression", - "title": "Include all intents", - "description": "True for all intents, false for only top intent." - }, - "includeInstanceData": { - "$ref": "#/definitions/booleanExpression", - "title": "Include $instance", - "description": "True to include $instance metadata in the LUIS response." - }, - "log": { - "$ref": "#/definitions/booleanExpression", - "title": "Log utterances", - "description": "True to log utterances on LUIS service." - }, - "preferExternalEntities": { - "$ref": "#/definitions/booleanExpression", - "title": "Prefer External Entities", - "description": "True to prefer external entities to those generated by LUIS models." - }, - "slot": { - "$ref": "#/definitions/stringExpression", - "title": "Slot", - "description": "Slot to use for talking to LUIS service like production or staging." - } - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.LuisRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.MentionEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Mentions Entity Recognizer", - "description": "Recognizer which recognizes @Mentions", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.MentionEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.MostSpecificSelector": { - "$role": "implements(Microsoft.ITriggerSelector)", - "title": "Most Specific Trigger Selector", - "description": "Select most specific true events with optional additional selector", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "selector": { - "$kind": "Microsoft.ITriggerSelector", - "$ref": "#/definitions/Microsoft.ITriggerSelector" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.MostSpecificSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.MultiLanguageRecognizer": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "Multi-language recognizer", - "description": "Configure one recognizer per language and the specify the language fallback policy.", - "type": "object", - "required": [ - "recognizers", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet. Other recognizers should return 'DeferToRecognizer_{Id}' intent when cross training data for this recognizer." - }, - "languagePolicy": { - "$kind": "Microsoft.LanguagePolicy", - "type": "object", - "title": "Language policy", - "description": "Defines fall back languages to try per user input language.", - "$ref": "#/definitions/Microsoft.LanguagePolicy" - }, - "recognizers": { - "type": "object", - "title": "Recognizers", - "description": "Map of language -> Recognizer", - "additionalProperties": { - "$kind": "Microsoft.IRecognizer", - "$ref": "#/definitions/Microsoft.IRecognizer" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.MultiLanguageRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.NumberEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Number Entity Recognizer", - "description": "Recognizer which recognizes numbers.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.NumberEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.NumberInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "title": "Number input dialog", - "description": "Collect information - Ask for a number.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "defaultValue": { - "$ref": "#/definitions/numberExpression", - "title": "Default value", - "description": "'Property' will be set to the value of this expression when max turn count is exceeded.", - "examples": [ - 13, - "=user.age" - ] - }, - "value": { - "$ref": "#/definitions/numberExpression", - "title": "Value", - "description": "'Property' will be set to the value of this expression unless it evaluates to null.", - "examples": [ - 13, - "=user.age" - ] - }, - "outputFormat": { - "$ref": "#/definitions/expression", - "title": "Output format", - "description": "Expression to format the number output.", - "examples": [ - "=this.value", - "=int(this.text)" - ] - }, - "defaultLocale": { - "$ref": "#/definitions/stringExpression", - "title": "Default locale", - "description": "Default locale to use if there is no locale available..", - "default": "en-us" - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.NumberInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.NumberRangeEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "NumberRange Entity Recognizer", - "description": "Recognizer which recognizes ranges of numbers (Example:2 to 5).", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.NumberRangeEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OAuthInput": { - "$role": "implements(Microsoft.IDialog)", - "title": "OAuthInput Dialog", - "description": "Collect login information.", - "type": "object", - "required": [ - "connectionName", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "connectionName": { - "$ref": "#/definitions/stringExpression", - "title": "Connection name", - "description": "The connection name configured in Azure Web App Bot OAuth settings.", - "examples": [ - "msgraphOAuthConnection" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "text": { - "$ref": "#/definitions/stringExpression", - "title": "Text", - "description": "Text shown in the OAuth signin card.", - "examples": [ - "Please sign in. ", - "=concat(x,y,z)" - ] - }, - "title": { - "$ref": "#/definitions/stringExpression", - "title": "Title", - "description": "Title shown in the OAuth signin card.", - "examples": [ - "Login" - ] - }, - "timeout": { - "$ref": "#/definitions/integerExpression", - "title": "Timeout", - "description": "Time out setting for the OAuth signin card.", - "default": 900000 - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Token property", - "description": "Property to store the OAuth token result.", - "examples": [ - "dialog.token" - ] - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send if user response is invalid.", - "examples": [ - "Sorry, the login info you provided is not valid." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Login failed." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3 - ] - }, - "defaultValue": { - "$ref": "#/definitions/expression", - "title": "Default value", - "description": "Expression to examine on each turn of the conversation as possible value to the property.", - "examples": [ - "@token" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OAuthInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On activity", - "description": "Actions to perform on receipt of a generic activity.", - "type": "object", - "required": [ - "type", - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "type": { - "type": "string", - "title": "Activity type", - "description": "The Activity.Type to match" - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnAssignEntity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On entity assignment", - "description": "Actions to take when an entity should be assigned to a property.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "property": { - "type": "string", - "title": "Property", - "description": "Property that will be set after entity is selected." - }, - "entity": { - "type": "string", - "title": "Entity", - "description": "Entity being put into property" - }, - "operation": { - "type": "string", - "title": "Operation", - "description": "Operation for assigning entity." - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnAssignEntity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnBeginDialog": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On begin dialog", - "description": "Actions to perform when this dialog begins.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnBeginDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnCancelDialog": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On cancel dialog", - "description": "Actions to perform on cancel dialog event.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnCancelDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnChooseEntity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On choose entity", - "description": "Actions to be performed when an entity value needs to be resolved.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "property": { - "type": "string", - "title": "Property to be set", - "description": "Property that will be set after entity is selected." - }, - "entity": { - "type": "string", - "title": "Ambiguous entity", - "description": "Ambiguous entity" - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnChooseEntity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnChooseIntent": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On ambigious intent", - "description": "Actions to perform on when an intent is ambigious.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "intents": { - "type": "array", - "title": "Intents", - "description": "Intents that must be in the ChooseIntent result for this condition to trigger.", - "items": { - "title": "Intent", - "description": "Intent name to trigger on.", - "type": "string" - } - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnChooseIntent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnChooseProperty": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On choose property", - "description": "Actions to take when there are multiple possible mappings of entities to properties.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "entity": { - "type": "string", - "title": "Entity being assigned", - "description": "Entity being assigned to property choice" - }, - "properties": { - "type": "array", - "title": "Possible properties", - "description": "Properties to be chosen between.", - "items": { - "type": "string", - "title": "Property name", - "description": "Possible property to choose." - } - }, - "entities": { - "type": "array", - "title": "Entities", - "description": "Ambiguous entity names.", - "items": { - "type": "string", - "title": "Entity name", - "description": "Entity name being chosen between." - } - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnChooseProperty" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnCondition": { - "$role": "implements(Microsoft.ITrigger)", - "title": "On condition", - "description": "Actions to perform when specified condition is true.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnCondition" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnContinueConversation": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Continue Conversation", - "description": "Actions to perform when a conversation is started up again from a ContinueConversationLater action.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnContinueConversation" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnConversationUpdateActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On ConversationUpdate activity", - "description": "Actions to perform on receipt of an activity with type 'ConversationUpdate'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnConversationUpdateActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnDialogEvent": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On dialog event", - "description": "Actions to perform when a specific dialog event occurs.", - "type": "object", - "required": [ - "actions", - "event", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "event": { - "type": "string", - "title": "Dialog event name", - "description": "Name of dialog event." - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnDialogEvent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnEndOfActions": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On end of actions", - "description": "Actions to take when there are no more actions in the current dialog.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnEndOfActions" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnEndOfConversationActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On EndOfConversation activity", - "description": "Actions to perform on receipt of an activity with type 'EndOfConversation'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnEndOfConversationActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnError": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Error", - "description": "Action to perform when an 'Error' dialog event occurs.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnError" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnEventActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Event activity", - "description": "Actions to perform on receipt of an activity with type 'Event'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnEventActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnHandoffActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Handoff activity", - "description": "Actions to perform on receipt of an activity with type 'HandOff'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnHandoffActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnInstallationUpdateActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On InstallationUpdate activity", - "description": "Actions to perform on receipt of an activity with type 'InstallationUpdate'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnInstallationUpdateActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnIntent": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On intent recognition", - "description": "Actions to perform when specified intent is recognized.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "intent": { - "type": "string", - "title": "Intent", - "description": "Name of intent." - }, - "entities": { - "type": "array", - "title": "Entities", - "description": "Required entities.", - "items": { - "type": "string", - "title": "Entity", - "description": "Entity that must be present." - } - }, - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnIntent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnInvokeActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Invoke activity", - "description": "Actions to perform on receipt of an activity with type 'Invoke'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnInvokeActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnMessageActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Message activity", - "description": "Actions to perform on receipt of an activity with type 'Message'. Overrides Intent trigger.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnMessageActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnMessageDeleteActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On MessageDelete activity", - "description": "Actions to perform on receipt of an activity with type 'MessageDelete'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnMessageDeleteActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnMessageReactionActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On MessageReaction activity", - "description": "Actions to perform on receipt of an activity with type 'MessageReaction'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnMessageReactionActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnMessageUpdateActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On MessageUpdate activity", - "description": "Actions to perform on receipt of an activity with type 'MessageUpdate'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnMessageUpdateActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnQnAMatch": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On QnAMaker Match", - "description": "Actions to perform on when an match from QnAMaker is found.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnQnAMatch" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnRepromptDialog": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On RepromptDialog", - "description": "Actions to perform when 'RepromptDialog' event occurs.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnRepromptDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnTypingActivity": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On Typing activity", - "description": "Actions to perform on receipt of an activity with type 'Typing'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnTypingActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OnUnknownIntent": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "On unknown intent", - "description": "Action to perform when user input is unrecognized or if none of the 'on intent recognition' triggers match recognized intent.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OnUnknownIntent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OrchestratorRecognizer": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "Orchestrator Recognizer", - "description": "Orchestrator recognizer.", - "type": "object", - "required": [ - "model", - "shapShot", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet." - }, - "modelPath": { - "$ref": "#/definitions/stringExpression", - "title": "Model", - "description": "NLR model file path.", - "default": "=settings.orchestrator.modelpath" - }, - "snapshotPath": { - "$ref": "#/definitions/stringExpression", - "title": "Endpoint Key", - "description": "SnapShot file path.", - "default": "=settings.orchestrator.shapshotpath" - }, - "entityRecognizers": { - "type": "array", - "title": "Entity recognizers", - "description": "Collection of entity recognizers to use.", - "items": { - "$kind": "Microsoft.IEntityRecognizer", - "$ref": "#/definitions/Microsoft.IEntityRecognizer" - } - }, - "disambiguationScoreThreshold": { - "$ref": "#/definitions/numberExpression", - "title": "Threshold", - "description": "Recognizer returns ChooseIntent (disambiguation) if other intents are classified within this score of the top scoring intent.", - "default": 0.05, - "examples": [ - "=true", - "=turn.scoreThreshold", - "=settings.orchestrator.disambigScoreThreshold" - ] - }, - "detectAmbiguousIntents": { - "$ref": "#/definitions/booleanExpression", - "title": "Detect ambiguous intents", - "description": "If true, recognizer will look for ambiguous intents (intents with close recognition scores from top scoring intent).", - "default": false, - "examples": [ - "=true", - "=turn.detectAmbiguousIntents", - "=settings.orchestrator.detectAmbiguousIntents" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OrchestratorRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.OrdinalEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Ordinal Entity Recognizer", - "description": "Recognizer which recognizes ordinals (example: first, second, 3rd).", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.OrdinalEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.PercentageEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Percentage Entity Recognizer", - "description": "Recognizer which recognizes percentages.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.PercentageEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.PhoneNumberEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Phone Number Entity Recognizer", - "description": "Recognizer which recognizes phone numbers.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.PhoneNumberEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.QnAMakerDialog": { - "$role": "implements(Microsoft.IDialog)", - "title": "QnAMaker Dialog", - "description": "Dialog which uses QnAMAker knowledge base to answer questions.", - "type": "object", - "required": [ - "knowledgeBaseId", - "endpointKey", - "hostname", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "knowledgeBaseId": { - "$ref": "#/definitions/stringExpression", - "title": "KnowledgeBase Id", - "description": "KnowledgeBase Id of your QnA Maker KnowledgeBase.", - "default": "=settings.qna.knowledgebaseid" - }, - "endpointKey": { - "$ref": "#/definitions/stringExpression", - "title": "Endpoint Key", - "description": "Endpoint key for the QnA Maker KB.", - "default": "=settings.qna.endpointkey" - }, - "hostname": { - "$ref": "#/definitions/stringExpression", - "title": "Hostname", - "description": "Hostname for your QnA Maker service.", - "default": "=settings.qna.hostname", - "examples": [ - "https://yourserver.azurewebsites.net/qnamaker" - ] - }, - "noAnswer": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Fallback answer", - "description": "Default answer to return when none found in KB.", - "default": "Sorry, I did not find an answer.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "threshold": { - "$ref": "#/definitions/numberExpression", - "title": "Threshold", - "description": "Threshold score to filter results.", - "default": 0.3 - }, - "activeLearningCardTitle": { - "$ref": "#/definitions/stringExpression", - "title": "Active learning card title", - "description": "Title for active learning suggestions card.", - "default": "Did you mean:" - }, - "cardNoMatchText": { - "$ref": "#/definitions/stringExpression", - "title": "Card no match text", - "description": "Text for no match option.", - "default": "None of the above." - }, - "cardNoMatchResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Card no match response", - "description": "Custom response when no match option was selected.", - "default": "Thanks for the feedback.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "strictFilters": { - "$ref": "#/definitions/arrayExpression", - "title": "Strict Filters", - "description": "Metadata filters to use when calling the QnA Maker KB.", - "items": { - "type": "object", - "title": "Metadata filter", - "description": "Metadata filter.", - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of filter property.", - "maximum": 100 - }, - "value": { - "type": "string", - "title": "Value", - "description": "Value to filter on.", - "maximum": 100 - } - } - } - }, - "top": { - "$ref": "#/definitions/numberExpression", - "title": "Top", - "description": "The number of answers you want to retrieve.", - "default": 3 - }, - "isTest": { - "type": "boolean", - "title": "IsTest", - "description": "True, if pointing to Test environment, else false.", - "default": false - }, - "rankerType": { - "$ref": "#/definitions/stringExpression", - "title": "Ranker Type", - "description": "Type of Ranker.", - "oneOf": [ - { - "title": "Standard ranker", - "description": "Standard ranker types.", - "enum": [ - "default", - "questionOnly", - "autoSuggestQuestion" - ], - "default": "default" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "strictFiltersCompoundOperationType": { - "$ref": "#/definitions/stringExpression", - "title": "strictFiltersCompoundOperationType", - "description": "Join operator for Strict Filters.", - "oneOf": [ - { - "title": "StrictFilters CompoundOperation Type", - "description": "Value of Join Operator to be used as Conjunction with Strict Filter Value.", - "enum": [ - "AND", - "OR" - ], - "default": "AND" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.QnAMakerDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.QnAMakerRecognizer": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "QnAMaker Recognizer", - "description": "Recognizer for generating QnAMatch intents from a KB.", - "type": "object", - "required": [ - "knowledgeBaseId", - "endpointKey", - "hostname", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet." - }, - "knowledgeBaseId": { - "$ref": "#/definitions/stringExpression", - "title": "KnowledgeBase Id", - "description": "KnowledgeBase Id of your QnA Maker KnowledgeBase.", - "default": "=settings.qna.knowledgebaseid" - }, - "endpointKey": { - "$ref": "#/definitions/stringExpression", - "title": "Endpoint Key", - "description": "Endpoint key for the QnA Maker KB.", - "default": "=settings.qna.endpointkey" - }, - "hostname": { - "$ref": "#/definitions/stringExpression", - "title": "Hostname", - "description": "Hostname for your QnA Maker service.", - "default": "=settings.qna.hostname", - "examples": [ - "https://yourserver.azurewebsites.net/qnamaker" - ] - }, - "threshold": { - "$ref": "#/definitions/numberExpression", - "title": "Threshold", - "description": "Threshold score to filter results.", - "default": 0.3 - }, - "strictFilters": { - "$ref": "#/definitions/arrayExpression", - "title": "Strict Filters", - "description": "Metadata filters to use when calling the QnA Maker KB.", - "items": { - "type": "object", - "title": "Metadata filters", - "description": "Metadata filters to use when querying QnA Maker KB.", - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name to filter on.", - "maximum": 100 - }, - "value": { - "type": "string", - "title": "Value", - "description": "Value to restrict filter.", - "maximum": 100 - } - } - } - }, - "top": { - "$ref": "#/definitions/numberExpression", - "title": "Top", - "description": "The number of answers you want to retrieve.", - "default": 3 - }, - "isTest": { - "$ref": "#/definitions/booleanExpression", - "title": "IsTest", - "description": "True, if pointing to Test environment, else false.", - "examples": [ - true, - "=f(x)" - ] - }, - "rankerType": { - "title": "Ranker Type", - "description": "Type of Ranker.", - "oneOf": [ - { - "type": "string", - "title": "Ranker type", - "description": "Type of Ranker.", - "enum": [ - "default", - "questionOnly", - "autoSuggestQuestion" - ], - "default": "default" - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "includeDialogNameInMetadata": { - "$ref": "#/definitions/booleanExpression", - "title": "Include Dialog Name", - "description": "When set to false, the dialog name will not be passed to QnAMaker. (default) is true", - "default": true, - "examples": [ - true, - "=f(x)" - ] - }, - "metadata": { - "$ref": "#/definitions/arrayExpression", - "title": "Metadata filters", - "description": "Metadata filters to use when calling the QnA Maker KB.", - "items": { - "type": "object", - "title": "Metadata filter", - "description": "Metadata filter to use when calling the QnA Maker KB.", - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of value to test." - }, - "value": { - "type": "string", - "title": "Value", - "description": "Value to filter against." - } - } - } - }, - "context": { - "$ref": "#/definitions/objectExpression", - "title": "QnARequestContext", - "description": "Context to use for ranking." - }, - "qnaId": { - "$ref": "#/definitions/integerExpression", - "title": "QnAId", - "description": "A number or expression which is the QnAId to paass to QnAMaker API." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.QnAMakerRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.RandomSelector": { - "$role": "implements(Microsoft.ITriggerSelector)", - "title": "Random rule selector", - "description": "Select most specific true rule.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "seed": { - "type": "integer", - "title": "Random seed", - "description": "Random seed to start random number generation." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.RandomSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.RecognizerSet": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "Recognizer Set", - "description": "Creates the union of the intents and entities of the recognizers in the set.", - "type": "object", - "required": [ - "recognizers", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet. Other recognizers should return 'DeferToRecognizer_{Id}' intent when cross training data for this recognizer." - }, - "recognizers": { - "type": "array", - "title": "Recognizers", - "description": "List of Recognizers defined for this set.", - "items": { - "$kind": "Microsoft.IRecognizer", - "$ref": "#/definitions/Microsoft.IRecognizer" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.RecognizerSet" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.RegexEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Regex Entity Recognizer", - "description": "Recognizer which recognizes patterns of input based on regex.", - "type": "object", - "required": [ - "name", - "pattern", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of the entity" - }, - "pattern": { - "type": "string", - "title": "Pattern", - "description": "Pattern expressed as regular expression." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.RegexEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.RegexRecognizer": { - "$role": "implements(Microsoft.IRecognizer)", - "title": "Regex recognizer", - "description": "Use regular expressions to recognize intents and entities from user input.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional unique id using with RecognizerSet. Other recognizers should return 'DeferToRecognizer_{Id}' intent when cross training data for this recognizer." - }, - "intents": { - "type": "array", - "title": "RegEx patterns to intents", - "description": "Collection of patterns to match for an intent.", - "items": { - "type": "object", - "title": "Pattern", - "description": "Intent and regex pattern.", - "properties": { - "intent": { - "type": "string", - "title": "Intent", - "description": "The intent name." - }, - "pattern": { - "type": "string", - "title": "Pattern", - "description": "The regular expression pattern." - } - } - } - }, - "entities": { - "type": "array", - "title": "Entity recognizers", - "description": "Collection of entity recognizers to use.", - "items": { - "$kind": "Microsoft.IEntityRecognizer", - "$ref": "#/definitions/Microsoft.IEntityRecognizer" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.RegexRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.RepeatDialog": { - "$role": "implements(Microsoft.IDialog)", - "type": "object", - "title": "Repeat dialog", - "description": "Repeat current dialog.", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "allowLoop": { - "$ref": "#/definitions/booleanExpression", - "title": "AllowLoop", - "description": "Optional condition which if true will allow loop of the repeated dialog.", - "examples": [ - "user.age > 3" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "options": { - "$ref": "#/definitions/objectExpression", - "title": "Options", - "description": "One or more options that are passed to the dialog that is called.", - "additionalProperties": { - "type": "string", - "title": "Options", - "description": "Options for repeating dialog." - } - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity Processed", - "description": "When set to false, the dialog that is called can process the current activity.", - "default": true - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.RepeatDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ReplaceDialog": { - "$role": "implements(Microsoft.IDialog)", - "type": "object", - "title": "Replace dialog", - "description": "Replace current dialog with another dialog.", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "dialog": { - "oneOf": [ - { - "$kind": "Microsoft.IDialog", - "pattern": "^(?!(=)).*", - "title": "Dialog", - "$ref": "#/definitions/Microsoft.IDialog" - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=settings.dialogId" - ] - } - ], - "title": "Dialog name", - "description": "Name of the dialog to call." - }, - "options": { - "$ref": "#/definitions/objectExpression", - "title": "Options", - "description": "One or more options that are passed to the dialog that is called.", - "additionalProperties": { - "type": "string", - "title": "Options", - "description": "Options for replacing dialog." - } - }, - "activityProcessed": { - "$ref": "#/definitions/booleanExpression", - "title": "Activity Processed", - "description": "When set to false, the dialog that is called can process the current activity.", - "default": true - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ReplaceDialog" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.ResourceMultiLanguageGenerator": { - "$role": "implements(Microsoft.ILanguageGenerator)", - "title": "Resource Multi-Language Generator", - "description": "MultiLanguage Generator which is bound to resource by resource Id.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional generator ID." - }, - "resourceId": { - "type": "string", - "title": "Resource Id", - "description": "Resource which is the root language generator. Other generaters with the same name and language suffix will be loaded into this generator and used based on the Language Policy.", - "default": "dialog.result" - }, - "languagePolicy": { - "type": "object", - "title": "Language Policy", - "description": "Set alternate language policy for this generator. If not set, the global language policy will be used." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.ResourceMultiLanguageGenerator" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.SendActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Send an activity", - "description": "Respond with an activity.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/stringExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "activity": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Activity", - "description": "Activity to send.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.SendActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.SetProperties": { - "$role": "implements(Microsoft.IDialog)", - "title": "Set property", - "description": "Set one or more property values.", - "type": "object", - "required": [ - "assignments", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "assignments": { - "type": "array", - "title": "Assignments", - "description": "Property value assignments to set.", - "items": { - "type": "object", - "title": "Assignment", - "description": "Property assignment.", - "properties": { - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property (named location to store information).", - "examples": [ - "user.age" - ] - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "New value or expression.", - "examples": [ - "='milk'", - "=dialog.favColor", - "=dialog.favColor == 'red'" - ] - } - } - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.SetProperties" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.SetProperty": { - "$role": "implements(Microsoft.IDialog)", - "title": "Set property", - "description": "Set property to a value.", - "type": "object", - "required": [ - "property", - "value", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property (named location to store information).", - "examples": [ - "user.age" - ] - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "New value or expression.", - "examples": [ - "='milk'", - "=dialog.favColor", - "=dialog.favColor == 'red'" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.SetProperty" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.SignOutUser": { - "$role": "implements(Microsoft.IDialog)", - "title": "Sign Out User", - "description": "Sign a user out that was logged in previously using OAuthInput.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "userId": { - "$ref": "#/definitions/stringExpression", - "title": "UserId", - "description": "Expression to an user to signout. Default is user.id.", - "default": "=user.id" - }, - "connectionName": { - "$ref": "#/definitions/stringExpression", - "title": "Connection Name", - "description": "Connection name that was used with OAuthInput to log a user in." - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.SignOutUser" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.StaticActivityTemplate": { - "$role": "implements(Microsoft.IActivityTemplate)", - "title": "Microsoft Static Activity Template", - "description": "This allows you to define a static Activity object", - "type": "object", - "required": [ - "activity", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "activity": { - "$ref": "#/definitions/botframework.json/definitions/Activity", - "title": "Activity", - "description": "A static Activity to used.", - "required": [ - "type" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.StaticActivityTemplate" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.SwitchCondition": { - "$role": "implements(Microsoft.IDialog)", - "title": "Switch condition", - "description": "Execute different actions based on the value of a property.", - "type": "object", - "required": [ - "condition", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "condition": { - "$ref": "#/definitions/stringExpression", - "title": "Condition", - "description": "Property to evaluate.", - "examples": [ - "user.favColor" - ] - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "cases": { - "type": "array", - "title": "Cases", - "description": "Actions for each possible condition.", - "items": { - "type": "object", - "title": "Case", - "description": "Case and actions.", - "required": [ - "value", - "actions" - ], - "properties": { - "value": { - "type": [ - "number", - "integer", - "boolean", - "string" - ], - "title": "Value", - "description": "The value to compare the condition with.", - "examples": [ - "red", - "true", - "13" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - } - } - } - }, - "default": { - "type": "array", - "title": "Default", - "description": "Actions to execute if none of the cases meet the condition.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.SwitchCondition" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TelemetryTrackEvent": { - "$role": "implements(Microsoft.IDialog)", - "type": "object", - "title": "Telemetry - Track Event", - "description": "Track a custom event using the registered Telemetry Client.", - "required": [ - "url", - "method", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - "user.age > 3" - ] - }, - "eventName": { - "$ref": "#/definitions/stringExpression", - "title": "Event Name", - "description": "The name of the event to track.", - "examples": [ - "MyEventStarted", - "MyEventCompleted" - ] - }, - "properties": { - "type": "object", - "title": "Properties", - "description": "One or more properties to attach to the event being tracked.", - "additionalProperties": { - "$ref": "#/definitions/stringExpression" - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TelemetryTrackEvent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TemperatureEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Temperature Recognizer", - "description": "Recognizer which recognizes temperatures.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TemperatureEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TemplateEngineLanguageGenerator": { - "$role": "implements(Microsoft.ILanguageGenerator)", - "title": "Template Multi-Language Generator", - "description": "Template Generator which allows only inline evaluation of templates.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional generator ID." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TemplateEngineLanguageGenerator" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.AssertCondition": { - "$role": "implements(Microsoft.IDialog)", - "title": "Assert Condition", - "description": "Assert condition is true.", - "type": "object", - "required": [ - "condition", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression to evalute", - "examples": [ - "user.age > 10" - ] - }, - "description": { - "type": "string", - "title": "Description", - "description": "Description of what the condition is testing" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.AssertCondition" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.AssertReply": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "Assert Reply", - "description": "Asserts that a reply text is valid.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "text": { - "type": "string", - "title": "Reply Text", - "description": "Expected reply text" - }, - "exact": { - "type": "boolean", - "title": "Exact Match", - "description": "If true then an exact match must happen, if false then the reply activity.text must contain the reply text. [Default:false]" - }, - "description": { - "type": "string", - "title": "Description", - "description": "The description of what the assertion is testing" - }, - "timeout": { - "type": "number", - "title": "Timeout", - "description": "The amount of time in milliseconds to wait for a reply (default is 3000)" - }, - "assertions": { - "type": "array", - "title": "Assertions to perform to validate Activity that is sent by the dialog", - "description": "Sequence of expressions which must evaluate to true.", - "items": { - "$ref": "#/definitions/condition", - "title": "Assertion", - "description": "Assertion as an expression, which must evaluate to true or it will fail the test script.", - "examples": [ - "user.vip == true" - ] - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.AssertReply" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.AssertReplyActivity": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "Assert Reply Activity", - "description": "Asserts that a reply activity is valid.", - "type": "object", - "required": [ - "assertions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "description": { - "type": "string", - "title": "Description", - "description": "The description of what the assertion is testing" - }, - "timeout": { - "type": "number", - "title": "Timeout", - "description": "The amount of time in milliseconds to wait for a reply (default is 3000)" - }, - "assertions": { - "type": "array", - "title": "Assertions to perform to validate Activity that is sent by the dialog", - "description": "Sequence of expressions which must evaluate to true.", - "items": { - "$ref": "#/definitions/condition", - "title": "Assertion", - "description": "Assertion as an expression, which must evaluate to true or it will fail the test script.", - "examples": [ - "user.vip == true" - ] - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.AssertReplyActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.AssertReplyOneOf": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "Assert Reply OneOf", - "description": "Asserts that a reply text is one of multiple optional responses.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "text": { - "type": "array", - "title": "Replies", - "description": "Expected replies (one of which must match).", - "items": { - "type": "string", - "title": "Expected reply", - "description": "Expected reply." - } - }, - "exact": { - "type": "boolean", - "title": "Exact Match", - "description": "If true then an exact match must happen, if false then the reply activity.text must contain the reply text. [Default:false]" - }, - "description": { - "type": "string", - "title": "Description", - "description": "The description of what the assertion is testing" - }, - "timeout": { - "type": "number", - "title": "Timeout", - "description": "The amount of time in milliseconds to wait for a reply (default is 3000)" - }, - "assertions": { - "type": "array", - "title": "Assertions to perform to validate Activity that is sent by the dialog", - "description": "Sequence of expressions which must evaluate to true.", - "items": { - "$ref": "#/definitions/condition", - "title": "Assertion", - "description": "Assertion as an expression, which must evaluate to true or it will fail the test script.", - "examples": [ - "user.vip == true" - ] - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.AssertReplyOneOf" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.CustomEvent": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "User Event", - "description": "Sends event to the bot from the user.", - "type": "object", - "required": [ - "name", - "value", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "name": { - "type": "string", - "title": "Event Name", - "description": "Event name to send to the bot." - }, - "value": { - "type": "object", - "title": "Event value", - "description": "Event value to send to the bot." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.CustomEvent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.HttpRequestSequenceMock": { - "$role": "implements(Microsoft.Test.IHttpRequestMock)", - "title": "HttpRequest Sequence Mock", - "description": "Mock HttpRequest in sequence order.", - "type": "object", - "required": [ - "url", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "method": { - "type": "string", - "title": "HTTP method", - "description": "HTTP method to match. If null, match to any method.", - "enum": [ - "GET", - "POST", - "PATCH", - "PUT", - "DELETE" - ], - "examples": [ - "GET", - "POST" - ] - }, - "url": { - "type": "string", - "title": "Url", - "description": "URL to match. Absolute or relative, may contain * wildcards.", - "examples": [ - "https://contoso.com" - ] - }, - "matchType": { - "type": "string", - "title": "Body Match Type", - "description": "The match type for body.", - "enum": [ - "Exact", - "Partial" - ], - "examples": [ - "Exact", - "Partial" - ], - "default": "Partial" - }, - "body": { - "type": "string", - "title": "Body", - "description": "The body to match against request's body.", - "examples": [ - "content" - ] - }, - "responses": { - "type": "array", - "title": "Responses", - "description": "Sequence of responses to reply. The last one will be repeated.", - "items": { - "type": "object", - "title": "HttpResponseMock", - "description": "Mocked http response.", - "properties": { - "statusCode": { - "title": "Status Code", - "description": "The status code. Default is OK(200).", - "oneOf": [ - { - "type": "string", - "title": "String Status Code", - "description": "Use string as status code.", - "enum": [ - "Continue", - "SwitchingProtocols", - "OK", - "Created", - "Accepted", - "NonAuthoritativeInformation", - "NoContent", - "ResetContent", - "PartialContent", - "Ambiguous", - "MultipleChoices", - "Moved", - "MovedPermanently", - "Found", - "Redirect", - "RedirectMethod", - "SeeOther", - "NotModified", - "UseProxy", - "Unused", - "RedirectKeepVerb", - "TemporaryRedirect", - "BadRequest", - "Unauthorized", - "PaymentRequired", - "Forbidden", - "NotFound", - "MethodNotAllowed", - "NotAcceptable", - "ProxyAuthenticationRequired", - "RequestTimeout", - "Conflict", - "Gone", - "LengthRequired", - "PreconditionFailed", - "RequestEntityTooLarge", - "RequestUriTooLong", - "UnsupportedMediaType", - "RequestedRangeNotSatisfiable", - "ExpectationFailed", - "UpgradeRequired", - "InternalServerError", - "NotImplemented", - "BadGateway", - "ServiceUnavailable", - "GatewayTimeout", - "HttpVersionNotSupported" - ], - "examples": [ - "OK" - ] - }, - { - "type": "number", - "title": "Number Status Code", - "description": "Use number as status code.", - "examples": [ - 200 - ] - } - ], - "default": "OK" - }, - "reasonPhrase": { - "type": "string", - "title": "Reason Phrase", - "description": "The reason phrase.", - "examples": [ - "Server is stolen." - ] - }, - "contentType": { - "type": "string", - "title": "ContentType", - "description": "Content type of response.", - "enum": [ - "String", - "ByteArray" - ], - "examples": [ - "String" - ], - "default": "String" - }, - "content": { - "title": "Content", - "description": "Content of response.", - "oneOf": [ - { - "type": "string", - "title": "String content", - "description": "Use string as content.", - "examples": [ - "string response" - ] - }, - { - "type": "object", - "title": "Object content", - "description": "Use object as content. It will be serialized to string.", - "examples": [ - { - "data": "object response" - } - ] - } - ] - } - } - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.HttpRequestSequenceMock" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.IHttpRequestMock": { - "title": "Microsoft Test IHttpRequestMock", - "description": "Components which derive from HttpRequestMock class", - "$role": "interface", - "oneOf": [ - { - "type": "string", - "title": "Reference to Microsoft.Test.IHttpRequestMock", - "description": "Reference to Microsoft.Test.IHttpRequestMock .dialog file." - }, - { - "$ref": "#/definitions/Microsoft.Test.HttpRequestSequenceMock" - } - ] - }, - "Microsoft.Test.IPropertyMock": { - "title": "Microsoft Test IPropertyMock", - "description": "Components which derive from PropertyMock class", - "$role": "interface" - }, - "Microsoft.Test.ITestAction": { - "title": "Microsoft Test ITestAction", - "description": "Components which derive from TestAction class", - "$role": "interface", - "oneOf": [ - { - "type": "string", - "title": "Reference to Microsoft.Test.ITestAction", - "description": "Reference to Microsoft.Test.ITestAction .dialog file." - }, - { - "$ref": "#/definitions/Microsoft.Test.AssertReply" - }, - { - "$ref": "#/definitions/Microsoft.Test.AssertReplyActivity" - }, - { - "$ref": "#/definitions/Microsoft.Test.AssertReplyOneOf" - }, - { - "$ref": "#/definitions/Microsoft.Test.CustomEvent" - }, - { - "$ref": "#/definitions/Microsoft.Test.MemoryAssertions" - }, - { - "$ref": "#/definitions/Microsoft.Test.SetProperties" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserActivity" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserConversationUpdate" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserDelay" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserSays" - }, - { - "$ref": "#/definitions/Microsoft.Test.UserTyping" - } - ] - }, - "Microsoft.Test.IUserTokenMock": { - "title": "Microsoft Test IUserTokenMock", - "description": "Components which derive from UserTokenMock class", - "$role": "interface", - "oneOf": [ - { - "type": "string", - "title": "Reference to Microsoft.Test.IUserTokenMock", - "description": "Reference to Microsoft.Test.IUserTokenMock .dialog file." - }, - { - "$ref": "#/definitions/Microsoft.Test.UserTokenBasicMock" - } - ] - }, - "Microsoft.Test.MemoryAssertions": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "Memory assertions", - "description": "Run assertions against current memory.", - "type": "object", - "required": [ - "assertions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "assertions": { - "type": "array", - "title": "Assertions against memory", - "description": "Sequence of expressions which must evaluate to true.", - "items": { - "$ref": "#/definitions/condition", - "title": "Assertion", - "description": "Assertion as an expression, which must evaluate to true or it will fail the test script.", - "examples": [ - "user.vip == true" - ] - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.MemoryAssertions" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.Script": { - "$role": [], - "title": "Test Script", - "description": "Defines a sequence of test actions to perform to validate the behavior of dialogs.", - "type": "object", - "required": [ - "dialog", - "script", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "dialog": { - "$kind": "Microsoft.IDialog", - "title": "Dialog", - "description": "The root dialog to execute the test script against.", - "$ref": "#/definitions/Microsoft.IDialog" - }, - "description": { - "type": "string", - "title": "Description", - "description": "Description of the test script" - }, - "httpRequestMocks": { - "type": "array", - "title": "Http Request Mocks", - "description": "Mock data for Microsoft.HttpRequest.", - "items": { - "$kind": "Microsoft.Test.IHttpRequestMock", - "$ref": "#/definitions/Microsoft.Test.IHttpRequestMock" - } - }, - "userTokenMocks": { - "type": "array", - "title": "User Token Mocks", - "description": "Mock data for Microsoft.OAuthInput.", - "items": { - "$kind": "Microsoft.Test.IUserTokenMock", - "$ref": "#/definitions/Microsoft.Test.IUserTokenMock" - } - }, - "script": { - "type": "array", - "title": "Test actions", - "description": "Sequence of test actions to execute.", - "items": { - "$kind": "Microsoft.Test.ITestAction", - "$ref": "#/definitions/Microsoft.Test.ITestAction" - } - }, - "locale": { - "type": "string", - "title": "Locale", - "description": "Set the locale for the user utterances in the script.", - "default": "en-us" - }, - "enableTrace": { - "type": "boolean", - "title": "Enable Trace Activity", - "description": "Enable trace activities in the unit test (default is false)", - "default": false - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.Script" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.SetProperties": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "Set properties", - "description": "Set one or more property values.", - "type": "object", - "required": [ - "assignments", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "assignments": { - "type": "array", - "title": "Assignments", - "description": "Property value assignments to set.", - "items": { - "type": "object", - "title": "Assignment", - "description": "Property assignment.", - "properties": { - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property (named location to store information).", - "examples": [ - "user.age" - ] - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "New value or expression.", - "examples": [ - "='milk'", - "=dialog.favColor", - "=dialog.favColor == 'red'" - ] - } - } - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.SetProperties" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.UserActivity": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "Send Activity", - "description": "Sends activity to the bot.", - "type": "object", - "required": [ - "activity", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "activity": { - "type": "object", - "title": "Activity", - "description": "Activity to send to bot.", - "additionalProperties": true - }, - "user": { - "type": "string", - "title": "User Name", - "description": "The activity.from.id and activity.from.name will be this if specified." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.UserActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.UserConversationUpdate": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "Send ConversationUpdate", - "description": "Sends ConversationUpdate activity to the bot.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "membersAdded": { - "type": "array", - "title": "Members Added", - "description": "Names of the members to add", - "items": { - "type": "string", - "title": "Name", - "description": "Name of member to add." - } - }, - "membersRemoved": { - "type": "array", - "title": "Members Removed", - "description": "Names of the members to remove", - "items": { - "type": "string", - "title": "Name", - "description": "Name of member to remove." - } - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.UserConversationUpdate" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.UserDelay": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "Delay Execution", - "description": "Delays text script for time period.", - "type": "object", - "required": [ - "timespan", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "timespan": { - "type": "number", - "title": "Timespan", - "description": "The amount of time in milliseconds to delay the execution of the test script" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.UserDelay" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.UserSays": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "User Text", - "description": "Sends text to the bot from the user.", - "type": "object", - "required": [ - "text", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "text": { - "type": "string", - "title": "Text", - "description": "Text to send to the bot." - }, - "user": { - "type": "string", - "title": "User Name", - "description": "The activity.from.id and activity.from.name will be this if specified." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.UserSays" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.UserTokenBasicMock": { - "$role": "implements(Microsoft.Test.IUserTokenMock)", - "title": "Microsoft Test UserTokenBasicMock", - "description": "Mock Basic UserToken", - "type": "object", - "required": [ - "connectionName", - "token", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "connectionName": { - "type": "string", - "title": "Connection Name", - "description": "The connection name.", - "examples": [ - "graph" - ] - }, - "channelId": { - "type": "string", - "title": "Channel ID", - "description": "The channel ID. If empty, same as adapter.Conversation.ChannelId.", - "examples": [ - "test" - ] - }, - "userId": { - "type": "string", - "title": "User ID", - "description": "The user ID. If empty, same as adapter.Conversation.User.Id.", - "examples": [ - "user1" - ] - }, - "token": { - "type": "string", - "title": "Token", - "description": "The token to store.", - "examples": [ - "token" - ] - }, - "magicCode": { - "type": "string", - "title": "Magic Code", - "description": "The optional magic code to associate with this token.", - "examples": [ - "000000" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.UserTokenBasicMock" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.Test.UserTyping": { - "$role": "implements(Microsoft.Test.ITestAction)", - "title": "Send Typing", - "description": "Sends typing activity to the bot.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "user": { - "type": "string", - "title": "User Name", - "description": "The activity.from.id and activity.from.name will be this if specified." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.Test.UserTyping" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TextInput": { - "$role": [ - "implements(Microsoft.IDialog)", - "extends(Microsoft.InputDialog)" - ], - "type": "object", - "title": "Text input dialog", - "description": "Collection information - Ask for a word or sentence.", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "defaultValue": { - "$ref": "#/definitions/stringExpression", - "title": "Default value", - "description": "'Property' will be set to the value of this expression when max turn count is exceeded.", - "examples": [ - "hello world", - "Hello ${user.name}", - "=concat(user.firstname, user.lastName)" - ] - }, - "value": { - "$ref": "#/definitions/stringExpression", - "title": "Value", - "description": "'Property' will be set to the value of this expression unless it evaluates to null.", - "examples": [ - "hello world", - "Hello ${user.name}", - "=concat(user.firstname, user.lastName)" - ] - }, - "outputFormat": { - "$ref": "#/definitions/stringExpression", - "title": "Output format", - "description": "Expression to format the output.", - "examples": [ - "=toUpper(this.value)", - "${toUpper(this.value)}" - ] - }, - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "default": false, - "examples": [ - false, - "=user.isVip" - ] - }, - "prompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Initial prompt", - "description": "Message to send to collect information.", - "examples": [ - "What is your birth date?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "unrecognizedPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Unrecognized prompt", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "invalidPrompt": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Invalid prompt", - "description": "Message to send when the user input does not meet any validation expression.", - "examples": [ - "Sorry, '{this.value}' does not work. I need a number between 1-150. What is your age?" - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "defaultValueResponse": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Default value response", - "description": "Message to send when max turn count (if specified) has been exceeded and the default value is selected as the value.", - "examples": [ - "Sorry, I'm having trouble understanding you. I will just use {this.options.defaultValue} for now. You can say 'I'm 36 years old' to change it." - ], - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "maxTurnCount": { - "$ref": "#/definitions/integerExpression", - "title": "Max turn count", - "description": "Maximum number of re-prompt attempts to collect information.", - "default": 3, - "examples": [ - 3, - "=settings.xyz" - ] - }, - "validations": { - "type": "array", - "title": "Validation expressions", - "description": "Expression to validate user input.", - "items": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Expression which needs to met for the input to be considered valid", - "examples": [ - "int(this.value) > 1 && int(this.value) <= 150", - "count(this.value) < 300" - ] - } - }, - "property": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store collected information. Input will be skipped if property has value (unless 'Always prompt' is true).", - "examples": [ - "$birthday", - "dialog.${user.name}", - "=f(x)" - ] - }, - "alwaysPrompt": { - "$ref": "#/definitions/booleanExpression", - "title": "Always prompt", - "description": "Collect information even if the specified 'property' is not empty.", - "default": false, - "examples": [ - false, - "=$val" - ] - }, - "allowInterruptions": { - "$ref": "#/definitions/booleanExpression", - "title": "Allow Interruptions", - "description": "A boolean expression that determines whether the parent should be allowed to interrupt the input.", - "default": true, - "examples": [ - true, - "=user.xyz" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TextInput" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TextTemplate": { - "$role": "implements(Microsoft.ITextTemplate)", - "title": "Microsoft TextTemplate", - "description": "Use LG Templates to create text", - "type": "object", - "required": [ - "template", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "template": { - "title": "Template", - "description": "Language Generator template to evaluate to create the text.", - "type": "string" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TextTemplate" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TraceActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Send a TraceActivity", - "description": "Send a trace activity to the transcript logger and/ or Bot Framework Emulator.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "name": { - "$ref": "#/definitions/stringExpression", - "title": "Name", - "description": "Name of the trace activity" - }, - "label": { - "$ref": "#/definitions/stringExpression", - "title": "Label", - "description": "Label for the trace activity (used to identify it in a list of trace activities.)" - }, - "valueType": { - "$ref": "#/definitions/stringExpression", - "title": "Value type", - "description": "Type of value" - }, - "value": { - "$ref": "#/definitions/valueExpression", - "title": "Value", - "description": "Property that holds the value to send as trace activity." - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TraceActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.TrueSelector": { - "$role": "implements(Microsoft.ITriggerSelector)", - "title": "True Trigger Selector", - "description": "Selector for all true events", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.TrueSelector" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.UpdateActivity": { - "$role": "implements(Microsoft.IDialog)", - "title": "Send an activity", - "description": "Respond with an activity.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=user.age > 3" - ] - }, - "activityId": { - "$ref": "#/definitions/stringExpression", - "title": "Activity Id", - "description": "An string expression with the activity id to update.", - "examples": [ - "=dialog.lastActivityId" - ] - }, - "activity": { - "$kind": "Microsoft.IActivityTemplate", - "title": "Activity", - "description": "Activity to send.", - "$ref": "#/definitions/Microsoft.IActivityTemplate" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.UpdateActivity" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Microsoft.UrlEntityRecognizer": { - "$role": "implements(Microsoft.IEntityRecognizer)", - "title": "Confirmation Url Recognizer", - "description": "Recognizer which recognizes urls.", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Microsoft.UrlEntityRecognizer" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnAppBasedLinkQuery": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsAppBasedLinkQuery", - "description": "Actions triggered when a Teams activity is received with activity.name == 'composeExtension/queryLink'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnAppBasedLinkQuery" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnCardAction": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsCardAction", - "description": "Actions triggered when a Teams InvokeActivity is received with no activity.name.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnCardAction" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnChannelCreated": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsChannelCreated", - "description": "Actions triggered when a Teams ConversationUpdateActivity with channelData.eventType == 'channelCreated'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnChannelCreated" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnChannelDeleted": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsChannelDeleted", - "description": "Actions triggered when a Teams ConversationUpdateActivity with channelData.eventType == 'channelDeleted'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnChannelDeleted" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnChannelRenamed": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsChannelRenamed", - "description": "Actions triggered when a Teams ConversationUpdateActivity with channelData.eventType == 'channelRenamed'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnChannelRenamed" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnChannelRestored": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsChannelRestored", - "description": "Actions triggered when a Teams ConversationUpdateActivity with channelData.eventType == 'channelRestored'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnChannelRestored" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnFileConsent": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsFileConsent", - "description": "Actions triggered when a Teams InvokeActivity is received with activity.name == 'fileConsent/invoke'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnFileConsent" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnMessagingExtensionCardButtonClicked": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsMessagingExtensionCardButtonClicked", - "description": "Actions triggered when a Teams InvokeActivity is received with activity.name='composeExtension/onCardButtonClicked'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnMessagingExtensionCardButtonClicked" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnMessagingExtensionConfigurationQuerySettingUrl": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsMessagingExtensionConfigurationQuerySettingUrl", - "description": "Actions triggered when a Teams InvokeActivity is received with name='composeExtension/querySettingUrl'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnMessagingExtensionConfigurationQuerySettingUrl" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnMessagingExtensionConfigurationSetting": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsMessagingExtensionConfigurationSetting", - "description": "Actions triggered when a Teams InvokeActivity is received with activity.name='composeExtension/setting'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnMessagingExtensionConfigurationSetting" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnMessagingExtensionFetchTask": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsMessagingExtensionFetchTask", - "description": "Actions triggered when a Teams InvokeActivity is received when activity.name='composeExtension/fetchTask'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnMessagingExtensionFetchTask" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnMessagingExtensionQuery": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsMessagingExtensionQuery", - "description": "Actions triggered when a Teams InvokeActivity is received with activity.name='composeExtension/query'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnMessagingExtensionQuery" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnMessagingExtensionSelectItem": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsMessagingExtensionSelectItem", - "description": "Actions triggered when a Teams InvokeActivity is received with activity.name='composeExtension/selectItem'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnMessagingExtensionSelectItem" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnMessagingExtensionSubmitAction": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsMessagingExtensionSubmitAction", - "description": "Actions triggered when a Teams InvokeActivity is received with activity.name='composeExtension/submitAction'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnMessagingExtensionSubmitAction" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnO365ConnectorCardAction": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsO365ConnectorCardAction", - "description": "Actions triggered when a Teams InvokeActivity is received for 'actionableMessage/executeAction'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnO365ConnectorCardAction" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnTaskModuleFetch": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsTaskModuleFetch", - "description": "Actions triggered when a Teams InvokeActivity is received with activity.name='task/fetch'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnTaskModuleFetch" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnTaskModuleSubmit": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsTaskModuleSubmit", - "description": "Actions triggered when a Teams InvokeActivity is received with activity.name='task/submit'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnTaskModuleSubmit" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnTeamArchived": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsTeamArchived", - "description": "Actions triggered when a Teams ConversationUpdate with channelData.eventType == 'teamArchived'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnTeamArchived" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnTeamDeleted": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsTeamDeleted", - "description": "Actions triggered when a Teams ConversationUpdate with channelData.eventType == 'teamDeleted'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnTeamDeleted" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnTeamHardDeleted": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsTeamHardDeleted", - "description": "Actions triggered when a Teams ConversationUpdate with channelData.eventType == 'teamHardDeleted'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnTeamHardDeleted" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnTeamRenamed": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsTeamRenamed", - "description": "Actions triggered when a Teams ConversationUpdate with channelData.eventType == 'teamRenamed'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnTeamRenamed" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnTeamRestored": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsTeamRestored", - "description": "Actions triggered when a Teams ConversationUpdate with channelData.eventType == 'teamRestored'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnTeamRestored" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Teams.OnTeamUnarchived": { - "$role": [ - "implements(Microsoft.ITrigger)", - "extends(Microsoft.OnCondition)" - ], - "title": "OnTeamsTeamUnarchived", - "description": "Actions triggered when a Teams ConversationUpdate with channelData.eventType == 'teamUnarchived'.", - "type": "object", - "required": [ - "actions", - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "condition": { - "$ref": "#/definitions/condition", - "title": "Condition", - "description": "Condition (expression).", - "examples": [ - "user.vip == true" - ] - }, - "actions": { - "type": "array", - "title": "Actions", - "description": "Sequence of actions to execute.", - "items": { - "$kind": "Microsoft.IDialog", - "$ref": "#/definitions/Microsoft.IDialog" - } - }, - "priority": { - "$ref": "#/definitions/integerExpression", - "title": "Priority", - "description": "Priority for trigger with 0 being the highest and < 0 ignored." - }, - "runOnce": { - "$ref": "#/definitions/booleanExpression", - "title": "Run Once", - "description": "True if rule should run once per unique conditions", - "examples": [ - true, - "=f(x)" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Teams.OnTeamUnarchived" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Testbot.JavascriptAction": { - "$role": "implements(Microsoft.IDialog)", - "title": "Javascript Action", - "description": "This gives you the ability to execute javascript to manipulate memory", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "id": { - "type": "string", - "title": "Id", - "description": "Optional id for the dialog" - }, - "disabled": { - "$ref": "#/definitions/booleanExpression", - "title": "Disabled", - "description": "Optional condition which if true will disable this action.", - "examples": [ - true, - "=f(x)" - ] - }, - "script": { - "type": "string", - "title": "Script", - "description": "name of the script file, or javascript function with function: doAction(memory, args) => result" - }, - "options": { - "$ref": "#/definitions/objectExpression", - "title": "Options", - "description": "One or more options that are passed to the function as args.", - "additionalProperties": { - "type": "string", - "title": "Options", - "description": "Options for action." - } - }, - "resultProperty": { - "$ref": "#/definitions/stringExpression", - "title": "Property", - "description": "Property to store any value returned by the javascript function.", - "examples": [ - "dialog.userName" - ] - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Testbot.JavascriptAction" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "Testbot.Multiply": { - "$role": "implements(Microsoft.IDialog)", - "title": "Multiply", - "description": "This will return the result of arg1*arg2", - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "arg1": { - "$ref": "#/definitions/numberExpression", - "title": "Arg1", - "description": "Value from callers memory to use as arg 1" - }, - "arg2": { - "$ref": "#/definitions/numberExpression", - "title": "Arg2", - "description": "Value from callers memory to use as arg 2" - }, - "result": { - "$ref": "#/definitions/stringExpression", - "title": "Result", - "description": "Property to store the result in" - }, - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "Testbot.Multiply" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "arrayExpression": { - "$role": "expression", - "title": "Array or expression", - "description": "Array or expression to evaluate.", - "oneOf": [ - { - "type": "array", - "title": "Array", - "description": "Array constant." - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "booleanExpression": { - "$role": "expression", - "title": "Boolean or expression", - "description": "Boolean constant or expression to evaluate.", - "oneOf": [ - { - "type": "boolean", - "title": "Boolean", - "description": "Boolean constant.", - "default": false, - "examples": [ - false - ] - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=user.isVip" - ] - } - ] - }, - "component": { - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "condition": { - "$role": "expression", - "title": "Boolean condition", - "description": "Boolean constant or expression to evaluate.", - "oneOf": [ - { - "$ref": "#/definitions/expression" - }, - { - "type": "boolean", - "title": "Boolean", - "description": "Boolean value.", - "default": true, - "examples": [ - false - ] - } - ] - }, - "equalsExpression": { - "$role": "expression", - "type": "string", - "title": "Expression", - "description": "Expression starting with =.", - "pattern": "^=.*\\S.*", - "examples": [ - "=user.name" - ] - }, - "expression": { - "$role": "expression", - "type": "string", - "title": "Expression", - "description": "Expression to evaluate.", - "pattern": "^.*\\S.*", - "examples": [ - "user.age > 13" - ] - }, - "integerExpression": { - "$role": "expression", - "title": "Integer or expression", - "description": "Integer constant or expression to evaluate.", - "oneOf": [ - { - "type": "integer", - "title": "Integer", - "description": "Integer constant.", - "default": 0, - "examples": [ - 15 - ] - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=user.age" - ] - } - ] - }, - "numberExpression": { - "$role": "expression", - "title": "Number or expression", - "description": "Number constant or expression to evaluate.", - "oneOf": [ - { - "type": "number", - "title": "Number", - "description": "Number constant.", - "default": 0, - "examples": [ - 15.5 - ] - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=dialog.quantity" - ] - } - ] - }, - "objectExpression": { - "$role": "expression", - "title": "Object or expression", - "description": "Object or expression to evaluate.", - "oneOf": [ - { - "type": "object", - "title": "Object", - "description": "Object constant." - }, - { - "$ref": "#/definitions/equalsExpression" - } - ] - }, - "role": { - "title": "$role", - "description": "Defines the role played in the dialog schema from [expression|interface|implements($kind)|extends($kind)].", - "type": "string", - "pattern": "^((expression)|(interface)|(implements\\([a-zA-Z][a-zA-Z0-9.]*\\))|(extends\\([a-zA-Z][a-zA-Z0-9.]*\\)))$" - }, - "root": { - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "root" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "stringExpression": { - "$role": "expression", - "title": "String or expression", - "description": "Interpolated string or expression to evaluate.", - "oneOf": [ - { - "type": "string", - "title": "String", - "description": "Interpolated string", - "pattern": "^(?!(=)).*", - "examples": [ - "Hello ${user.name}" - ] - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=concat('x','y','z')" - ] - } - ] - }, - "test": { - "type": "object", - "required": [ - "$kind" - ], - "additionalProperties": false, - "patternProperties": { - "^\\$": { - "title": "Tooling property", - "description": "Open ended property for tooling." - } - }, - "properties": { - "$kind": { - "title": "Kind of dialog object", - "description": "Defines the valid properties for the component you are configuring (from a dialog .schema file)", - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9.]*$", - "const": "test" - }, - "$designer": { - "title": "Designer information", - "type": "object", - "description": "Extra information for the Bot Framework Composer." - } - } - }, - "valueExpression": { - "$role": "expression", - "title": "Any or expression", - "description": "Any constant or expression to evaluate.", - "oneOf": [ - { - "type": "object", - "title": "Object", - "description": "Object constant." - }, - { - "type": "array", - "title": "Array", - "description": "Array constant." - }, - { - "type": "string", - "title": "String", - "description": "Interpolated string.", - "pattern": "^(?!(=)).*", - "examples": [ - "Hello ${user.name}" - ] - }, - { - "type": "boolean", - "title": "Boolean", - "description": "Boolean constant", - "examples": [ - false - ] - }, - { - "type": "number", - "title": "Number", - "description": "Number constant.", - "examples": [ - 15.5 - ] - }, - { - "$ref": "#/definitions/equalsExpression", - "examples": [ - "=..." - ] - } - ] - }, - "schema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Core schema meta-schema", - "definitions": { - "schemaArray": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/schema" - } - }, - "nonNegativeInteger": { - "type": "integer", - "minimum": 0 - }, - "nonNegativeIntegerDefault0": { - "type": "integer", - "minimum": 0, - "default": 0 - }, - "simpleTypes": { - "enum": [ - "array", - "boolean", - "integer", - "null", - "number", - "object", - "string" - ] - }, - "stringArray": { - "type": "array", - "uniqueItems": true, - "default": [], - "items": { - "type": "string" - } - } - }, - "type": [ - "object", - "boolean" - ], - "default": true, - "properties": { - "$schema": { - "type": "string", - "format": "uri" - }, - "$ref": { - "type": "string", - "format": "uri-reference" - }, - "$comment": { - "type": "string" - }, - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "default": true, - "readOnly": { - "type": "boolean", - "default": false - }, - "writeOnly": { - "type": "boolean", - "default": false - }, - "examples": { - "type": "array", - "items": true - }, - "multipleOf": { - "type": "number", - "exclusiveMinimum": 0 - }, - "maximum": { - "type": "number" - }, - "exclusiveMaximum": { - "type": "number" - }, - "minimum": { - "type": "number" - }, - "exclusiveMinimum": { - "type": "number" - }, - "maxLength": { - "$ref": "#/definitions/schema/definitions/nonNegativeInteger" - }, - "minLength": { - "$ref": "#/definitions/schema/definitions/nonNegativeIntegerDefault0" - }, - "pattern": { - "type": "string", - "format": "regex" - }, - "additionalItems": { - "$ref": "#/definitions/schema" - }, - "items": { - "anyOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "$ref": "#/definitions/schema/definitions/schemaArray" - } - ], - "default": true - }, - "maxItems": { - "$ref": "#/definitions/schema/definitions/nonNegativeInteger" - }, - "minItems": { - "$ref": "#/definitions/schema/definitions/nonNegativeIntegerDefault0" - }, - "uniqueItems": { - "type": "boolean", - "default": false - }, - "contains": { - "$ref": "#/definitions/schema" - }, - "maxProperties": { - "$ref": "#/definitions/schema/definitions/nonNegativeInteger" - }, - "minProperties": { - "$ref": "#/definitions/schema/definitions/nonNegativeIntegerDefault0" - }, - "required": { - "$ref": "#/definitions/schema/definitions/stringArray" - }, - "additionalProperties": { - "$ref": "#/definitions/schema" - }, - "definitions": { - "type": "object", - "default": {}, - "additionalProperties": { - "$ref": "#/definitions/schema" - } - }, - "properties": { - "type": "object", - "default": {}, - "additionalProperties": { - "$ref": "#/definitions/schema" - } - }, - "patternProperties": { - "type": "object", - "propertyNames": { - "format": "regex" - }, - "default": {}, - "additionalProperties": { - "$ref": "#/definitions/schema" - } - }, - "dependencies": { - "type": "object", - "additionalProperties": { - "anyOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "$ref": "#/definitions/schema/definitions/stringArray" - } - ] - } - }, - "propertyNames": { - "$ref": "#/definitions/schema" - }, - "const": true, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true, - "items": true - }, - "type": { - "anyOf": [ - { - "$ref": "#/definitions/schema/definitions/simpleTypes" - }, - { - "type": "array", - "items": { - "$ref": "#/definitions/schema/definitions/simpleTypes" - }, - "minItems": 1, - "uniqueItems": true - } - ] - }, - "format": { - "type": "string" - }, - "contentMediaType": { - "type": "string" - }, - "contentEncoding": { - "type": "string" - }, - "if": { - "$ref": "#/definitions/schema" - }, - "then": { - "$ref": "#/definitions/schema" - }, - "else": { - "$ref": "#/definitions/schema" - }, - "allOf": { - "$ref": "#/definitions/schema/definitions/schemaArray" - }, - "anyOf": { - "$ref": "#/definitions/schema/definitions/schemaArray" - }, - "oneOf": { - "$ref": "#/definitions/schema/definitions/schemaArray" - }, - "not": { - "$ref": "#/definitions/schema" - } - } - }, - "botframework.json": { - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "ChannelAccount": { - "description": "Channel account information needed to route a message", - "title": "ChannelAccount", - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "description": "Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or\n123456)", - "type": "string", - "title": "id" - }, - "name": { - "description": "Display friendly name", - "type": "string", - "title": "name" - }, - "aadObjectId": { - "description": "This account's object ID within Azure Active Directory (AAD)", - "type": "string", - "title": "aadObjectId" - }, - "role": { - "description": "Role of the entity behind the account (Example: User, Bot, etc.). Possible values include:\n'user', 'bot'", - "type": "string", - "title": "role" - } - } - }, - "ConversationAccount": { - "description": "Channel account information for a conversation", - "title": "ConversationAccount", - "type": "object", - "required": [ - "conversationType", - "id", - "isGroup", - "name" - ], - "properties": { - "isGroup": { - "description": "Indicates whether the conversation contains more than two participants at the time the\nactivity was generated", - "type": "boolean", - "title": "isGroup" - }, - "conversationType": { - "description": "Indicates the type of the conversation in channels that distinguish between conversation types", - "type": "string", - "title": "conversationType" - }, - "id": { - "description": "Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or\n123456)", - "type": "string", - "title": "id" - }, - "name": { - "description": "Display friendly name", - "type": "string", - "title": "name" - }, - "aadObjectId": { - "description": "This account's object ID within Azure Active Directory (AAD)", - "type": "string", - "title": "aadObjectId" - }, - "role": { - "description": "Role of the entity behind the account (Example: User, Bot, etc.). Possible values include:\n'user', 'bot'", - "enum": [ - "bot", - "user" - ], - "type": "string", - "title": "role" - } - } - }, - "MessageReaction": { - "description": "Message reaction object", - "title": "MessageReaction", - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "description": "Message reaction type. Possible values include: 'like', 'plusOne'", - "type": "string", - "title": "type" - } - } - }, - "CardAction": { - "description": "A clickable action", - "title": "CardAction", - "type": "object", - "required": [ - "title", - "type", - "value" - ], - "properties": { - "type": { - "description": "The type of action implemented by this button. Possible values include: 'openUrl', 'imBack',\n'postBack', 'playAudio', 'playVideo', 'showImage', 'downloadFile', 'signin', 'call',\n'payment', 'messageBack'", - "type": "string", - "title": "type" - }, - "title": { - "description": "Text description which appears on the button", - "type": "string", - "title": "title" - }, - "image": { - "description": "Image URL which will appear on the button, next to text label", - "type": "string", - "title": "image" - }, - "text": { - "description": "Text for this action", - "type": "string", - "title": "text" - }, - "displayText": { - "description": "(Optional) text to display in the chat feed if the button is clicked", - "type": "string", - "title": "displayText" - }, - "value": { - "description": "Supplementary parameter for action. Content of this property depends on the ActionType", - "title": "value" - }, - "channelData": { - "description": "Channel-specific data associated with this action", - "title": "channelData" - } - } - }, - "SuggestedActions": { - "description": "SuggestedActions that can be performed", - "title": "SuggestedActions", - "type": "object", - "required": [ - "actions", - "to" - ], - "properties": { - "to": { - "description": "Ids of the recipients that the actions should be shown to. These Ids are relative to the\nchannelId and a subset of all recipients of the activity", - "type": "array", - "title": "to", - "items": { - "title": "Id", - "description": "Id of recipient.", - "type": "string" - } - }, - "actions": { - "description": "Actions that can be shown to the user", - "type": "array", - "title": "actions", - "items": { - "$ref": "#/definitions/botframework.json/definitions/CardAction" - } - } - } - }, - "Attachment": { - "description": "An attachment within an activity", - "title": "Attachment", - "type": "object", - "required": [ - "contentType" - ], - "properties": { - "contentType": { - "description": "mimetype/Contenttype for the file", - "type": "string", - "title": "contentType" - }, - "contentUrl": { - "description": "Content Url", - "type": "string", - "title": "contentUrl" - }, - "content": { - "type": "object", - "description": "Embedded content", - "title": "content" - }, - "name": { - "description": "(OPTIONAL) The name of the attachment", - "type": "string", - "title": "name" - }, - "thumbnailUrl": { - "description": "(OPTIONAL) Thumbnail associated with attachment", - "type": "string", - "title": "thumbnailUrl" - } - } - }, - "Entity": { - "description": "Metadata object pertaining to an activity", - "title": "Entity", - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "description": "Type of this entity (RFC 3987 IRI)", - "type": "string", - "title": "type" - } - } - }, - "ConversationReference": { - "description": "An object relating to a particular point in a conversation", - "title": "ConversationReference", - "type": "object", - "required": [ - "bot", - "channelId", - "conversation", - "serviceUrl" - ], - "properties": { - "activityId": { - "description": "(Optional) ID of the activity to refer to", - "type": "string", - "title": "activityId" - }, - "user": { - "description": "(Optional) User participating in this conversation", - "$ref": "#/definitions/botframework.json/definitions/ChannelAccount", - "title": "user" - }, - "bot": { - "$ref": "#/definitions/botframework.json/definitions/ChannelAccount", - "description": "Bot participating in this conversation", - "title": "bot" - }, - "conversation": { - "$ref": "#/definitions/botframework.json/definitions/ConversationAccount", - "description": "Conversation reference", - "title": "conversation" - }, - "channelId": { - "description": "Channel ID", - "type": "string", - "title": "channelId" - }, - "serviceUrl": { - "description": "Service endpoint where operations concerning the referenced conversation may be performed", - "type": "string", - "title": "serviceUrl" - } - } - }, - "TextHighlight": { - "description": "Refers to a substring of content within another field", - "title": "TextHighlight", - "type": "object", - "required": [ - "occurrence", - "text" - ], - "properties": { - "text": { - "description": "Defines the snippet of text to highlight", - "type": "string", - "title": "text" - }, - "occurrence": { - "description": "Occurrence of the text field within the referenced text, if multiple exist.", - "type": "number", - "title": "occurrence" - } - } - }, - "SemanticAction": { - "description": "Represents a reference to a programmatic action", - "title": "SemanticAction", - "type": "object", - "required": [ - "entities", - "id" - ], - "properties": { - "id": { - "description": "ID of this action", - "type": "string", - "title": "id" - }, - "entities": { - "description": "Entities associated with this action", - "type": "object", - "title": "entities", - "additionalProperties": { - "$ref": "#/definitions/botframework.json/definitions/Entity" - } - } - } - }, - "Activity": { - "description": "An Activity is the basic communication type for the Bot Framework 3.0 protocol.", - "title": "Activity", - "type": "object", - "properties": { - "type": { - "description": "Contains the activity type. Possible values include: 'message', 'contactRelationUpdate',\n'conversationUpdate', 'typing', 'endOfConversation', 'event', 'invoke', 'deleteUserData',\n'messageUpdate', 'messageDelete', 'installationUpdate', 'messageReaction', 'suggestion',\n'trace', 'handoff'", - "type": "string", - "title": "type" - }, - "id": { - "description": "Contains an ID that uniquely identifies the activity on the channel.", - "type": "string", - "title": "id" - }, - "timestamp": { - "description": "Contains the date and time that the message was sent, in UTC, expressed in ISO-8601 format.", - "type": "string", - "format": "date-time", - "title": "timestamp" - }, - "localTimestamp": { - "description": "Contains the date and time that the message was sent, in local time, expressed in ISO-8601\nformat.\nFor example, 2016-09-23T13:07:49.4714686-07:00.", - "type": "string", - "format": "date-time", - "title": "localTimestamp" - }, - "localTimezone": { - "description": "Contains the name of the timezone in which the message, in local time, expressed in IANA Time\nZone database format.\nFor example, America/Los_Angeles.", - "type": "string", - "title": "localTimezone" - }, - "serviceUrl": { - "description": "Contains the URL that specifies the channel's service endpoint. Set by the channel.", - "type": "string", - "title": "serviceUrl" - }, - "channelId": { - "description": "Contains an ID that uniquely identifies the channel. Set by the channel.", - "type": "string", - "title": "channelId" - }, - "from": { - "$ref": "#/definitions/botframework.json/definitions/ChannelAccount", - "description": "Identifies the sender of the message.", - "title": "from" - }, - "conversation": { - "$ref": "#/definitions/botframework.json/definitions/ConversationAccount", - "description": "Identifies the conversation to which the activity belongs.", - "title": "conversation" - }, - "recipient": { - "$ref": "#/definitions/botframework.json/definitions/ChannelAccount", - "description": "Identifies the recipient of the message.", - "title": "recipient" - }, - "textFormat": { - "description": "Format of text fields Default:markdown. Possible values include: 'markdown', 'plain', 'xml'", - "type": "string", - "title": "textFormat" - }, - "attachmentLayout": { - "description": "The layout hint for multiple attachments. Default: list. Possible values include: 'list',\n'carousel'", - "type": "string", - "title": "attachmentLayout" - }, - "membersAdded": { - "description": "The collection of members added to the conversation.", - "type": "array", - "title": "membersAdded", - "items": { - "$ref": "#/definitions/botframework.json/definitions/ChannelAccount" - } - }, - "membersRemoved": { - "description": "The collection of members removed from the conversation.", - "type": "array", - "title": "membersRemoved", - "items": { - "$ref": "#/definitions/botframework.json/definitions/ChannelAccount" - } - }, - "reactionsAdded": { - "description": "The collection of reactions added to the conversation.", - "type": "array", - "title": "reactionsAdded", - "items": { - "$ref": "#/definitions/botframework.json/definitions/MessageReaction" - } - }, - "reactionsRemoved": { - "description": "The collection of reactions removed from the conversation.", - "type": "array", - "title": "reactionsRemoved", - "items": { - "$ref": "#/definitions/botframework.json/definitions/MessageReaction" - } - }, - "topicName": { - "description": "The updated topic name of the conversation.", - "type": "string", - "title": "topicName" - }, - "historyDisclosed": { - "description": "Indicates whether the prior history of the channel is disclosed.", - "type": "boolean", - "title": "historyDisclosed" - }, - "locale": { - "description": "A locale name for the contents of the text field.\nThe locale name is a combination of an ISO 639 two- or three-letter culture code associated\nwith a language\nand an ISO 3166 two-letter subculture code associated with a country or region.\nThe locale name can also correspond to a valid BCP-47 language tag.", - "type": "string", - "title": "locale" - }, - "text": { - "description": "The text content of the message.", - "type": "string", - "title": "text" - }, - "speak": { - "description": "The text to speak.", - "type": "string", - "title": "speak" - }, - "inputHint": { - "description": "Indicates whether your bot is accepting,\nexpecting, or ignoring user input after the message is delivered to the client. Possible\nvalues include: 'acceptingInput', 'ignoringInput', 'expectingInput'", - "type": "string", - "title": "inputHint" - }, - "summary": { - "description": "The text to display if the channel cannot render cards.", - "type": "string", - "title": "summary" - }, - "suggestedActions": { - "description": "The suggested actions for the activity.", - "$ref": "#/definitions/botframework.json/definitions/SuggestedActions", - "title": "suggestedActions" - }, - "attachments": { - "description": "Attachments", - "type": "array", - "title": "attachments", - "items": { - "$ref": "#/definitions/botframework.json/definitions/Attachment" - } - }, - "entities": { - "description": "Represents the entities that were mentioned in the message.", - "type": "array", - "title": "entities", - "items": { - "$ref": "#/definitions/botframework.json/definitions/Entity" - } - }, - "channelData": { - "description": "Contains channel-specific content.", - "title": "channelData" - }, - "action": { - "description": "Indicates whether the recipient of a contactRelationUpdate was added or removed from the\nsender's contact list.", - "type": "string", - "title": "action" - }, - "replyToId": { - "description": "Contains the ID of the message to which this message is a reply.", - "type": "string", - "title": "replyToId" - }, - "label": { - "description": "A descriptive label for the activity.", - "type": "string", - "title": "label" - }, - "valueType": { - "description": "The type of the activity's value object.", - "type": "string", - "title": "valueType" - }, - "value": { - "description": "A value that is associated with the activity.", - "title": "value" - }, - "name": { - "description": "The name of the operation associated with an invoke or event activity.", - "type": "string", - "title": "name" - }, - "relatesTo": { - "description": "A reference to another conversation or activity.", - "$ref": "#/definitions/botframework.json/definitions/ConversationReference", - "title": "relatesTo" - }, - "code": { - "description": "The a code for endOfConversation activities that indicates why the conversation ended.\nPossible values include: 'unknown', 'completedSuccessfully', 'userCancelled', 'botTimedOut',\n'botIssuedInvalidMessage', 'channelFailed'", - "type": "string", - "title": "code" - }, - "expiration": { - "description": "The time at which the activity should be considered to be \"expired\" and should not be\npresented to the recipient.", - "type": "string", - "format": "date-time", - "title": "expiration" - }, - "importance": { - "description": "The importance of the activity. Possible values include: 'low', 'normal', 'high'", - "type": "string", - "title": "importance" - }, - "deliveryMode": { - "description": "A delivery hint to signal to the recipient alternate delivery paths for the activity.\nThe default delivery mode is \"default\". Possible values include: 'normal', 'notification'", - "type": "string", - "title": "deliveryMode" - }, - "listenFor": { - "description": "List of phrases and references that speech and language priming systems should listen for", - "type": "array", - "title": "listenFor", - "items": { - "type": "string", - "title": "Phrase", - "description": "Phrase to listen for." - } - }, - "textHighlights": { - "description": "The collection of text fragments to highlight when the activity contains a ReplyToId value.", - "type": "array", - "title": "textHighlights", - "items": { - "$ref": "#/definitions/botframework.json/definitions/TextHighlight" - } - }, - "semanticAction": { - "$ref": "#/definitions/botframework.json/definitions/SemanticAction", - "description": "An optional programmatic action accompanying this request", - "title": "semanticAction" - } - } - } - } - } - } -}